2010-03-18 51 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