6

いくつかの条件に基づいてのみ属性を追加したいなど、xslt の条件が 1 行ありますか?

例えば

<name (conditionTrue then defineAttribute)/>

もし避けるために

<xsl:if test="true">
   <name defineAttribute/>
</xsl:if>
4

2 に答える 2

10

<xsl:element>出力要素と<xsl:attribute>その属性の作成に使用できます。次に、条件付き属性を追加するのは簡単です。

<xsl:element name="name">
  <xsl:if test="condition">
     <xsl:attribute name="myattribute">somevalue</xsl:attribute>
  </xsl:if>
</xsl:element>
于 2012-11-02T07:02:21.033 に答える
8

これは、指定する必要性を完全に回避する方法の一例です<xsl:if>

このXMLドキュメントを作成しましょう

<a x="2">
 <b/>
</a>

また、の親の属性の値が偶数の場合にのみb、属性に追加します。parentEven="true"xb

明示的な条件付き命令なしでこれを行う方法は次のとおりです。

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="a[@x mod 2 = 0]/b">
  <b parentEven="true">
   <xsl:apply-templates select="node()|@*"/>
  </b>
 </xsl:template>
</xsl:stylesheet>

この変換を上記のXMLドキュメントに適用すると、必要な正しい結果が生成されます。

<a x="2">
   <b parentEven="true"/>
</a>

注意してください

テンプレートとパターンマッチングを使用すると、明示的な条件付き命令を指定する必要が完全になくなります。XSLTコードに明示的な条件付き命令が存在することは、「コードの臭い」と見なされ、可能な限り回避される必要があります。

于 2012-11-02T12:31:15.010 に答える