我有一个包含预处理集(DoesNotContainChildElement)的xsl:变量。我认为msxsl:node-set()添加了一个根元素,因此位置始终为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>
发布于 2012-04-07 18:24:31
不,函数msxsl:node-set不会添加任何根节点,它只是XSLT1.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()来访问所有子节点。
发布于 2012-04-07 09:25:04
你可以试试msxsl:node-set($DoesNotContainChildElement)/*。如果msxsl:node-set()确实添加了一个根节点,那么将/*添加到您的路径中将会遍历子节点,您可以在子节点上测试位置。
或者,您可以简单地使用<xsl:apply-templates select="msxsl:node-set($DoesNotContainChildElement)/*" mode="testposition"/>和<xsl:template match="*" mode="testposition">…。
发布于 2012-04-07 15:37:43
因为只有一个变量$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,它将导致逐个输出变量的每个子元素。
如果您希望仅输出选定的子元素,则需要使用第二种形式。当您第一次应用node-set函数将rtf更改为node-set时也是如此。
https://stackoverflow.com/questions/10048752
复制相似问题