2009-10-21 36 views
4

這是這樣CUSTOM SORT XSL?

輸入我的XML結構: -

<MYDATA> 
    <DETAILS> 
     <DESCRIPTION>EASE</DESCRIPTION> 
    </DETAILS> 

    <DETAILS> 
     <DESCRIPTION>COMPLEX</DESCRIPTION> 
    </DETAILS> 

    <DETAILS> 
     <DESCRIPTION>SIMPLE</DESCRIPTION> 
    </DETAILS> 
</MYDATA> 

我要顯示這樣使用XSL排序意味着自定義排序我想要顯示firts簡單第二安逸和第三複雜

輸出: -

<MYDATA> 

    <DETAILS> 
     <DESCRIPTION>SIMPLE</DESCRIPTION> 
    </DETAILS> 


    <DETAILS> 
     <DESCRIPTION>EASE</DESCRIPTION> 
    </DETAILS> 

    <DETAILS> 
     <DESCRIPTION>COMPLEX</DESCRIPTION> 
    </DETAILS> 

     </MYDATA> 
+0

你知道,那個孩子元素在XML中所有相同的水平。您首先獲得的元素取決於您的XML解析器。一些解析XML文件自下而上...所以「簡單」將在這種情況下首先。 如果你真的需要你的XML中的排序順序,需要指定某種指標(如屬性)。 – fmuecke 2009-10-21 08:42:53

+0

@fmuecke - WTF? XML本質上是有序的,所以你*不需要這樣做。 – 2009-10-21 08:48:49

+0

是真的嗎?我不太確定。 – fmuecke 2009-10-21 13:48:22

回答

1

如果你知道你能做什麼所有可能的值,你可以做一系列的條件,具體apply-templates電話:

<xsl:apply-templates select="Details[Description = 'Simple']" /> 
<xsl:apply-templates select="Details[Description = 'Ease']" /> 
<xsl:apply-templates select="Details[Description = 'Complex']" /> 

所以,如果你知道你想要他們在什麼樣的順序和潛在的選項都不會改變,它會輸出他們可以以任意順序您apply-templates規則設置。

當然,如果它是比這更復雜,你可能會考慮在數據面上存儲排序順序,幷包含在你的XSL,所以你可以通過只是排序。

3

有解決問題的一般方法。 你需要的是定義你要使用的排序列表中的變量。 然後您使用recusive調用按該順序顯示元素。 Basicly你通過變量「中將sortOrder」的元素去,然後應用到使用該值的選擇你需要的節點應用模板調用。

<?xml version="1.0"?> 

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


    <xsl:variable name="sortOrder">EASE|SIMPLE|COMPLEX|</xsl:variable> 

    <xsl:template match="/"> 
     <MYDATA> 
      <xsl:call-template name="SortElements"> 
       <xsl:with-param name="sortList" select="$sortOrder"/> 
      </xsl:call-template> 
     </MYDATA> 

    </xsl:template> 

    <xsl:template name="SortElements"> 
     <xsl:param name="sortList"/> 


     <xsl:variable name="element" select="substring-before ($sortList, '|')"/> 

     <xsl:if test="$element != ''"> 
      <xsl:apply-templates select="/MYDATA/DETAILS [DESCRIPTION = $element]"/> 

      <xsl:call-template name="SortElements"> 
       <xsl:with-param name="sortList" select="substring-after ($sortList, '|')"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="DETAILS"> 
     <DETAILS> 
      <DESCRIPTION> 
       <xsl:value-of select="DESCRIPTION"/> 
      </DESCRIPTION> 
     </DETAILS> 
    </xsl:template> 

</xsl:stylesheet> 
3

從聖何塞的想法開始,這裏的東西用更少的代碼:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:variable name="DifficultyLevel">EASE|SIMPLE|COMPLEX|</xsl:variable> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="MYDATA"> 
    <xsl:apply-templates select="@* | node()"> 
     <xsl:sort order="ascending" select="string-length(substring-before($DifficultyLevel, DETAILS/DESCRIPTION))"/> 
    </xsl:apply-templates> 
    </xsl:template> 
</xsl:stylesheet> 
+0

哇,這真棒,正是我需要的! – Boland 2014-09-03 02:18:49

+0

不要忘記添加數據類型=「數字」到您的排序,否則會排序文本明智(例如6> 32).... – Boland 2014-09-03 02:33:19