CUSTOM SORT XSL?

时间:2009-10-21 08:34:51

标签: xslt sorting

这是我的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>

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分: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中,以便您可以按此排序。