2

XSLTに属性値を変更/追加する方法があるのだろうか。

今、私は単に属性値を置き換えています:

<a class="project" href="#">
  <xsl:if test="new = 'Yes'">
    <xsl:attribute name="class">project new</xsl:attribute>
  </xsl:if>
</a>

しかし、2行目の繰り返しは好きではありませんproject。これを行うためのより良い方法はありますか。たとえば、属性の最後に追加するだけです。 new

助けてくれてありがとう!

4

2 に答える 2

3

逆の代わりにif内側に置くことができます:attribute

<a href="#">
  <xsl:attribute name="class">
    <xsl:text>project</xsl:text>
    <xsl:if test="new = 'Yes'">
      <xsl:text> new</xsl:text>
    </xsl:if>
  </xsl:attribute>
</a>

には任意<xsl:attribute>の有効なXSLTテンプレート(for-eachループ、他のテンプレートの適用などを含む)を含めることができます。唯一の制限は、このテンプレートのインスタンス化では、要素や属性などではなく、テキストノードのみを生成する必要があることです。属性値はこれらすべての連結になります。テキストノード。

于 2012-12-30T19:39:53.213 に答える
0

XSLT 1.0では、次のワンライナーを使用できます

<a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>

これが完全な変換です:

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

 <xsl:template match="/*">
  <a class="project{substring(' new', 5 - 4*(new = 'Yes'))}"/>
 </xsl:template>
</xsl:stylesheet>

この変換が次のXMLドキュメントに適用される場合:

<t>
 <new>Yes</new>
</t>

必要な正しい結果が生成されます。

<a class="project new"/>

説明

  1. AVT(属性値テンプレート)の使用

  2. 条件に基づいて文字列を選択するには、XPath 1.0で部分文字列関数を使用し、開始インデックス引数として式を指定できます。この式は、条件が1の場合は1にtrue()、文字列の長さよりも大きい数値に評価されます。 -その他。

  3. *XPath 1.0では、 (乗算)演算子の引数が数値に変換されるという事実を使用しますnumber(true()) = 1number(false()) = 0


II。XSLT 2.0ソリューション

このワンライナーを使用してください

  <a class="project{(' new', '')[current()/new = 'Yes']}"/>

これが完全な変換です:

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

 <xsl:template match="/*">
  <a class="project{(' new', '')[current()/new = 'Yes']}"/>
 </xsl:template>
</xsl:stylesheet>

同じXMLドキュメント(上記)に適用すると、同じように、正しい結果が生成されます。

<a class="project new"/>

説明

  1. AVTの適切な使用。

  2. シーケンスの適切な使用。

  3. XSLTcurrent()関数の適切な使用。

于 2012-12-30T20:11:29.250 に答える