我有一个xsl:变量,它包含一个预处理集(DoesNotContainChildElement)。我认为msxsl:node-set()正在添加一个根元素,所以position始终是1.但是我需要它的前15个元素。
<xsl:variable name="Summary">
<xsl:for-each select="msxsl:node-set($DoesNotContainChildElement)">
<xsl:if test="position() < 16">
<xsl:copy-of select="."></xsl:copy-of>
</xsl:if>
</xsl:for-each>
答案 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更改为节点集时,同样适用。