2009-10-21 93 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