我有一组节点
<menuList>
<mode name="aasdf"/>
<mode name="vfssdd"/>
<mode name="aswer"/>
<mode name="ddffe"/>
<mode name="ffrthjhj"/>
<mode name="dfdf"/>
<mode name="vbdg"/>
<mode name="wewer"/>
<mode name="mkiiu"/>
<mode name="yhtyh"/>
and so on...
</menuList>我现在就是这样排序的
<xsl:variable name="rtf">
<xsl:for-each select="//menuList/mode">
<xsl:sort data-type="text" order="ascending" select="@name"/>
<xsl:value-of select="@name"/>
</xsl:for-each>
</xsl:variable>现在我需要在已排序的数组中获取一个任意元素,使其达到其位置的数量。我使用的代码是:
<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>我得到了一个响应错误。我该怎么做呢?
发布于 2010-03-19 00:47:56
提供的代码中至少有两个错误:
<xsl:value-of select="@name"/>当存在多个相邻文本节点时,它们将合并为一个。结果是RTF只有一个(长)文本节点,而没有第三个节点。
2.<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>
这需要包含在exsl:node-set($rtf)中的第三个节点,但是exsl:node-set($rtf)是由exsl:node-set()扩展函数生成的临时树的文档节点--这只是一个节点。因此,上面的XPath表达式根本没有选择任何内容。
一个正确的解决方案是下面的
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
>
<xsl:template match="/">
<xsl:variable name="rtf">
<xsl:for-each select="//menuList/mode">
<xsl:sort data-type="text" order="ascending" select="@name"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select="msxsl:node-set($rtf)/*[position()=3]/@name"/>
</xsl:template>
</xsl:stylesheet>发布于 2010-03-19 00:44:34
您可以在变量中使用<xsl:value-of>。这不会复制节点,但会复制其字符串值(节点的@name属性值)。这意味着您将生成一个包含连接字符串的变量,但不包含任何结构。
尝试:
<xsl:variable name="rtf">
<xsl:for-each select="//menuList/mode">
<xsl:sort select="@name" data-type="text" order="ascending" />
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>现在,您的变量包含一个结果树片段,其中包含按您喜欢的顺序排列的<mode>节点,这意味着:
<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" />
<!-- don't forget you have element nodes now! ^^^^^^ -->会起作用的。还要注意,…/*[position() = 3]和…/*[3]是一回事。
https://stackoverflow.com/questions/2470907
复制相似问题