XSLT:基于多个属性对XML进行排序

时间:2011-07-29 10:46:26

标签: xslt sorting attributes

I have the following xml and I need to sort this xml using XSLT based on the value of 
the "CONTENT_LENGTH" KEY ie. based on the attributes in the element <DOC_DETAIL     
KEY="CONTENT_LENGTH" VALUE="14"/>

<?xml version="1.0" encoding="UTF-8"?>
<DOC_LISTS>
<DOC_LIST>
<DOC_URL>testurl4</DOC_URL>
<DOC_DETAILS>
<DOC_DETAIL KEY="TITLE" VALUE="Red Dragon"/>
<DOC_DETAIL KEY="LANGUAGE" VALUE="english"/>
<DOC_DETAIL KEY="CONTENT_LENGTH" VALUE="14"/>
</DOC_DETAILS>
</DOC_LIST>
<DOC_LIST>
<DOC_URL>testurl2</DOC_URL>
<DOC_DETAILS>
<DOC_DETAIL KEY="TITLE" VALUE="Hannibal Rising"/>
<DOC_DETAIL KEY="LANGUAGE" VALUE="english"/>
<DOC_DETAIL KEY="CONTENT_LENGTH" VALUE="7"/>
</DOC_DETAILS>
</DOC_LIST>
</DOC_LISTS>

What will be the sort select statement in <xsl:sort select=""/>?

2 个答案:

答案 0 :(得分:1)

您需要DOC_DETAILS/DOC_DETAIL[@KEY='CONTENT_LENGTH']/@VALUE

使用身份模板的完整简单示例

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="//DOC_LISTS">
  <xsl:for-each select="DOC_LIST">
    <xsl:sort select="DOC_DETAILS/DOC_DETAIL[@KEY='CONTENT_LENGTH']/@VALUE" data-type="number"/>
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:for-each>
</xsl:template>

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

答案 1 :(得分:0)

使用身份转换时,立即对应用模板的值进行排序,如下所示:

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

    <xsl:template match="DOC_LISTS">
       <xsl:copy>
        <xsl:apply-templates select="DOC_LIST">
            <xsl:sort select="
                DOC_DETAILS
                /DOC_DETAIL[@KEY='CONTENT_LENGTH']
                    /@VALUE" data-type="number"/>
        </xsl:apply-templates>
       </xsl:copy>
    </xsl:template>

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

</xsl:stylesheet>