首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序的exsl:node-set。根据节点位置返回节点

排序的exsl:node-set。根据节点位置返回节点
EN

Stack Overflow用户
提问于 2010-03-18 23:13:55
回答 2查看 2.2K关注 0票数 2

我有一组节点

代码语言:javascript
复制
<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>

我现在就是这样排序的

代码语言:javascript
复制
 <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>

现在我需要在已排序的数组中获取一个任意元素,使其达到其位置的数量。我使用的代码是:

代码语言:javascript
复制
<xsl:value-of select="exsl:node-set($rtf)[position() = 3]"/>

我得到了一个响应错误。我该怎么做呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-19 00:47:56

提供的代码中至少有两个错误:

  1. <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表达式根本没有选择任何内容。

一个正确的解决方案是下面的

代码语言:javascript
复制
<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>
票数 4
EN

Stack Overflow用户

发布于 2010-03-19 00:44:34

您可以在变量中使用<xsl:value-of>。这不会复制节点,但会复制其字符串值(节点的@name属性值)。这意味着您将生成一个包含连接字符串的变量,但不包含任何结构。

尝试:

代码语言:javascript
复制
<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>节点,这意味着:

代码语言:javascript
复制
<xsl:value-of select="exsl:node-set($rtf)/*[3]/@name" />
<!-- don't forget you have element nodes now! ^^^^^^ -->

会起作用的。还要注意,…/*[position() = 3]…/*[3]是一回事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2470907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档