繁体   English   中英

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

[英]Sorted exsl:node-set. Return node by it position

我有一组节点

<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]"/>

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

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

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

一种正确的解决方案如下

<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>

您在变量中使用<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]是同一件事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM