排序exsl:node-set。按位置返回节点

时间:2010-03-18 15:13:55

标签: 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="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]"/>

我得到了回复错误。我应该怎么做?

2 个答案:

答案 0 :(得分:4)

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

  1. <xsl:value-of select="@name"/>
  2. 当存在多个相邻文本节点时,它们将合并为一个。结果是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>
    

答案 1 :(得分:2)

您在变量中使用<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]是相同的。