Xslt 自定义排序XSL?

Xslt 自定义排序XSL?,xslt,sorting,Xslt,Sorting,这是我的XML结构,如下所示 输入:- <MYDATA> <DETAILS> <DESCRIPTION>EASE</DESCRIPTION> </DETAILS> <DETAILS> <DESCRIPTION>COMPLEX</DESCRIPTION> </DETAILS> <DETAILS>

这是我的XML结构,如下所示

输入:-

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

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

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

缓解
复杂的
简单的
我想用xsl排序显示,这意味着自定义排序,我想显示第一个简单的第二个简单的第三个复杂的

输出:-

<MYDATA>

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


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

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

        </MYDATA>

简单的
缓解
复杂的

如果您知道所有可能的值,您可以执行一系列特定于条件的
应用模板
调用:

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

因此,如果您知道希望它们的顺序,并且潜在的选项不会改变,那么它将以
apply templates
规则设置的任何顺序输出它们


当然,如果它比这更复杂,您可以考虑在数据面上存储排序顺序,并将其包含在XSL中,这样就可以排序。

< P>有一个通用的方法来解决这个问题。 您需要的是用您想要使用的排序列表定义一个变量。 然后使用递归调用按顺序显示元素。 基本上,通过变量“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>

轻松|简单|复杂|

从Jose的想法开始,这里有一些代码更少的东西:

<?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>

轻松|简单|复杂|

您知道,子元素在XML中都是同一级别的。首先获取的元素取决于XML解析器。有些解析xml文件是自下而上的…所以在这种情况下“简单”是第一个。如果在xml中确实需要排序顺序,则需要指定某种索引(作为属性)。@fmuecke-WTF?XML本质上是有序的,所以不需要这样做。真的吗?我不太确定。我希望看到这个问题得到解决,我需要使用类型列表进行排序。我想使用循环使代码更具元素性。哇,这太棒了,正是我所需要的!!不要忘记在排序中添加data type=“number”,否则它将按文本排序(例如6>32)。。。。