0

前処理されたセット(DoesNotContainChildElement)を含むxsl:variableがあります。msxsl:node-set()はルート要素を追加しているので、位置は常に1だと思います。しかし、必要なのは上位15要素です。

<xsl:variable name="Summary">
<xsl:for-each select="msxsl:node-set($DoesNotContainChildElement)">
  <xsl:if test="position() &lt; 16">
    <xsl:copy-of select="."></xsl:copy-of>
  </xsl:if>
</xsl:for-each>

4

3 に答える 3

3

いいえ、関数msxsl:node-setはルートノードを追加しません。XSLT1.0では次のようなサンプルを追加するだけです。

<xsl:variable name="rtf1">
  <item>1</item>
  <item>2</item>
  <item>3</item>
</xsl:variable>

結果ツリーフラグメントを作成し、 「結果ツリーフラグメントは、単一のルートノードのみを含むノードセットと同等に扱われます」。itemしたがって、上記のサンプルには、3つの子要素を含む単一のルートノードを持つ結果ツリーフラグメントがあります。

msxsl:node-set(rtf1)次に、拡張関数を適用するnode-setと、結果ツリーフラグメントの代わりに、ノードセットに3itemつの子要素を持つ単一のルートノードが含まれるようになります。したがって、item必要な要素にアクセスする場合、msxsl:node-set($rtf1)/*またはより一般的msxsl:node-set($rtf1)/node()にすべての子ノードにアクセスする場合。

于 2012-04-07T10:24:30.500 に答える
1
于 2012-04-07T01:25:03.617 に答える
1

There's only one variable $DoesNotContainChildElement so a for-each will only yield value 1 for position().
You can check that by running the following:

<xsl:for-each select="$x">
    <pos1><xsl:value-of select="position()"/></pos1>
</xsl:for-each>
<xsl:for-each select="$x/*">
    <pos2><xsl:value-of select="position()"/></pos2>
</xsl:for-each>

Where x is a (node-set type) variable.
The result will look something like

<pos1>1</pos1>
<pos2>1</pos2>
<pos2>2</pos2>
<pos2>3</pos2>
<pos2>...</pos2>

Adding <xsl:copy-of select="."/> will result in the output of the entire variable contents in case of the first for-each above, whereas for the second for-each it will result in the output of each sub-element of the variable one-by-one.
The second form is the one to use if you wish to output only selected sub-elements. The same holds when you first apply the node-set function to change an rtf into a node-set.

于 2012-04-07T07:37:43.470 に答える