2010-03-18 48 views
2

我有一组节点排序后的exsl:节点集。通过它返回节点定位

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

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

+0

见我的答案,这说明在你和@托默勒格的解决方案的问题,并提供正确的解决方案。 :) – 2010-03-18 16:52:14

回答

4

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

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

非常感谢。我附上了你的代码,结果一切都结束了。没有你我不会应付。对于我的最后一个问题,我有这样的要求:“XSL:列表分成多列”。现在(在你的帮助下)代码完全正确地工作(首先是排序,然后是列的分区)。再次感谢你。 – Kalinin 2010-03-18 17:25:46

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]是一样的东西。

+0

@Tomalak 我做了你所说的一切。但回应没有收到。 – Kalinin 2010-03-18 16:49:41

+0

@Tomalak,其实,你的解决方案是不正确的,不会产生任何东西。 你是comitting错误2.在我的答案中描述。 – 2010-03-18 16:51:15

+0

另外你声称OP代码中的'不会产生任何东西。事实上,这会产生一个文本节点,由'@ name'属性的字符串值组成。 – 2010-03-18 17:18:08