msxsl:node-set()和position()不能一起工作

时间:2012-04-06 20:14:23

标签: xslt

我有一个xsl:变量,它包含一个预处理集(DoesNotContainChildElement)。我认为msxsl:node-set()正在添加一个根元素,所以position始终是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>

3 个答案:

答案 0 :(得分:3)

不,函数msxsl:node-set不会添加任何根节点,只需使用XSLT 1.0就可以添加样本

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

创建a result tree fragment和“结果树片段被等效地​​处理为仅包含单个根节点的节点集”。因此,在上面的示例中,我们有一个结果树片段,其中包含一个包含三个item子元素的根节点。

应用msxsl:node-set(rtf1)扩展函数,然后为您提供node-set而不是结果树片段,现在节点集包含一个具有三个item子元素的根节点。因此,如果您想要访问item元素,则需要msxsl:node-set($rtf1)/*或更多一般msxsl:node-set($rtf1)/node()来访问所有子节点。

答案 1 :(得分:1)

您可以尝试msxsl:node-set($DoesNotContainChildElement)/*。如果msxsl:node-set()添加根节点是正确的,那么将/*添加到您的路径将迭代子节点,您可以在其中测试位置。

或者,您只需使用<xsl:apply-templates select="msxsl:node-set($DoesNotContainChildElement)/*" mode="testposition"/><xsl:template match="*" mode="testposition">…

答案 2 :(得分:1)

只有一个变量$ DoesNotContainChildElement,因此for-each只会为position()产生值1。
您可以通过运行以下命令来检查:

<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>

其中x是(节点集类型)变量 结果看起来像

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

添加<xsl:copy-of select="."/>将导致整个变量内容的输出在第一个for-each的情况下,而对于第二个for-each,它将导致变量的每个子元素的输出一个接一个。
如果您希望仅输出选定的子元素,则使用第二种形式。 当您首次应用节点集函数将rtf更改为节点集时,同样适用。