Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 已排序的exsl:节点集。按位置返回节点_Xslt_Xpath_Position_Exslt_Node Set - Fatal编程技术网

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]
是同一件事。

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

  • 当存在多个相邻文本节点时,它们将合并为一个。结果是RTF只有一个(长的)单个文本节点,而没有第三个节点

    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>