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=""/>?
答案 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>