Xslt 已排序的exsl:节点集。按位置返回节点
我有一组节点Xslt 已排序的exsl:节点集。按位置返回节点,xslt,xpath,position,exslt,node-set,Xslt,Xpath,Position,Exslt,Node Set,我有一组节点 <menuList> <mode name="aasdf"/> <mode name="vfssdd"/> <mode name="aswer"/> <mode name="ddffe"/> <mode name="ffrthjhj"/> <mode name="dfdf"/> <mode name="vbdg"/> <mode name="wewe
<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]"/>
我得到一个响应错误。我应该怎么做?在变量中使用
。这不会复制节点,而是复制其字符串值(节点的@name
属性值)。这意味着您将生成一个包含串联字符串的变量,但不包含任何结构
尝试:
现在,您的变量包含一个结果树片段,该片段由
节点按您的首选顺序组成,这意味着:
<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" />
<!-- don't forget you have element nodes now! ^^^^^^ -->
会有用的。还请注意,
../*[position()=3]
和../*[3]
是同一件事。提供的代码中至少有两个错误:
2
这需要包含在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>
@Tomalak我都照你说的做了。但是作为对什么都没有收到的回应。@Tomalak,实际上,您的解决方案是不正确的,并且没有产生任何结果。你犯了第二个错误。在我的回答中描述。你还声称OP代码中的
没有产生任何东西。事实上,这会生成一个文本节点,由@name
属性的字符串值组成。@Dimitre,你说得对,这对我来说太草率了。“在这方面我已经更正了我的答案。”托马拉克很高兴我发现了它。现在没事了。请看我的答案,它解释了您和@Tomalak解决方案中的问题,并提供了正确的解决方案。:)非常感谢你。我已经附上了你的代码和一切结果。没有你,我将无法应付。对于我的最后一个问题:“XSL:List-divided-into-columns”,我有这样的分类是必要的。现在(在您的帮助下)代码完全正常工作(首先是排序,然后是列的分区)。再次感谢你。
<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>