0

誰かが私にこれを説明できますか?(最新のlibxsltを使用):

 <a><xsl:copy-of select="(@attrib|exsl:node-set(0))"/></a>
 <b><xsl:copy-of select="(@attrib|exsl:node-set(0))[position()=1]"/></b>

 <x><xsl:copy-of select="(@attrib|exsl:node-set(0))[1]"/></x>
 <xsl:variable name="value" select="@attrib"/>
 <y><xsl:copy-of select="($value|exsl:node-set(0))[1]"/></y>

結果(現在のノードで@attrib = 1の場合):

 <a attrib="1">0</a>
 <b attrib="1"/>

 <x>0</x>
 <y attrib="1"/>

<a><b>期待される動作を示します。
<x>私見は正しくありません。
しかし、なぜ変数に入れる@attribとそれが「修正」されるの<y>でしょうか。

ところで:存在しないときはすべてが正しい@attrib isです。ここで使用されるコピーはデバッグ用です。元の使用法はXPathの結果を数値に変換し、属性が欠落しているとNaNにはなりませんが、特定のデフォルト値になります。

4

2 に答える 2

1

OPのコメントから:

わかりました、それは私の唯一のオプションが<xsl:choose>...を使用していることを意味します、正しいですか?

@Michael Kayと私のコメントの両方で説明されている理由により、それを試みる方法は予測できない結果を生み出しますが、あなたが望むことを行う方法はまだあります(attrib属性の値またはデフォルト値(0のいずれかを生成します:

concat(@attrib,
       substring(0, 2 -not(@attrib))
       )

これにより、attrib属性の値(この属性が存在する場合)または(存在しない場合)デフォルト値が生成されます0

完全なXSLTソリューション

<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="x">
  <xsl:value-of select=
   "concat(@attrib,
           substring('0', 2 -not(@attrib))
           )"/>

==========
 </xsl:template>
</xsl:stylesheet>

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

<t>
 <x attrib="abc"/>
 <x/>
</t>

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

 abc

==========

 0

==========
于 2011-12-18T03:27:32.990 に答える
1

このバージョンのexsl:node-set()は、おそらくノード@attribとは異なるツリーにあるノードを作成します。2つのノードが異なるツリーにある場合、どちらがドキュメントの順序で最初に来るかは実装に依存します。コンストラクト(X|Y)[position()=1](または同等に(X|Y)[1])は、XとYのどちらかがドキュメントの順序で最初に来る方を選択します。したがって、XとYのどちらを選択するかは本質的に予測できません。

于 2011-12-18T00:49:02.577 に答える