2017-01-15 2 views
0

<errors>ノードが含まれている場合と含まれていない場合があります。私のXSLファイルでParamと@attributeを使用して条件付きXMLを表示する

<xsl:template name="FieldError" mode="user"> 
    <xsl:param name="attribute" /> 
    <xsl:if test="errors[@attribute=$attribute]"> 
     <span class="form-error"><xsl:value-of select="errors[@attribute=$attribute]" /></span> 
    </xsl:if> 
</xsl:template> 

:私はFieldErrorテンプレートを持っている

<errors> 
    <first_name>Not allowed to be BigBoy</first_name> 
    <email>Required</email> 
</errors> 

:エラーとエラー通知

だから、この例は次のようになりますが存在するために任意のフィールド名を含みますフィールド名の横にエラー通知を表示しようとしています。したがって、各フォームフィールドの後にFieldErrorテンプレートを呼び出します。

first_nameフィールドの後:

<xsl:call-template name="FieldError" mode="planner_user"> 
<xsl:with-param name="attribute">first_name</xsl:with-param></xsl:call-template> 

電子メールフィールドの後:

<xsl:call-template name="FieldError" mode="user"> 
<xsl:with-param name="attribute">email</xsl:with-param></xsl:call-template> 

私はこの前に働いていたと確信している、と私はちょうど私が間違ってこの時間

+0

'email'要素は' errors'要素の子要素ではなく属性です。したがって、属性を選択する '@'を使うことは意味をなさない。特定の子要素が存在することを確認するには、 'test =" errors/* [local-name()= $ param] "' '(' param'から 'param'にパラメータ名を変更しました名前の混乱)。 –

+0

さらに詳しい例を投稿できますか?あなたが存在をチェックしたい要素の名前を知っていれば、単純に ''を実行することができます。そうでない場合は、**キー**を使用して要素を動的に指定します。 –

答えて

0

は、次の点を考慮してやっている地球上のものを参照してください傾けます例:

XML

<root> 
    <errors> 
     <first_name>Not allowed to be BigBoy</first_name> 
     <email>Required</email> 
    </errors> 
    <data> 
     <first_name>BigBoy</first_name> 
     <last_name>Smith</last_name> 
     <email></email> 
    </data> 
</root> 

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="err" match="errors/*" use="name()" /> 

<xsl:template match="/root"> 
    <output> 
     <xsl:apply-templates select="data"/> 
    </output> 
</xsl:template> 

<xsl:template match="data/*"> 
    <xsl:copy> 
     <value> 
      <xsl:value-of select="."/> 
     </value> 
     <xsl:apply-templates select="key('err', name())"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="errors/*"> 
    <error> 
     <xsl:value-of select="."/> 
    </error> 
</xsl:template> 

</xsl:stylesheet> 

結果

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <first_name> 
     <value>BigBoy</value> 
     <error>Not allowed to be BigBoy</error> 
    </first_name> 
    <last_name> 
     <value>Smith</value> 
    </last_name> 
    <email> 
     <value/> 
     <error>Required</error> 
    </email> 
</output> 
+0

このアイデアをお寄せいただき、ありがとうございます。 私の理解のための問題ですが、私はシステムを移植しており、あなたが示したコードは完全に動作している別のページからのものです。だから私は困っています。 – PixelGnome

+0

@PixelGnome [mcve]を見ないとあなたのコードがうまくいかない理由を言うのは難しいです。 –

関連する問題