[英]Sorting XML file through multiple attributes
我想通過多個屬性(首先按T,然后按L)對“自由格式” XML文件進行排序。 XML有點復雜,其結構如下所示:
<?xml version="1.0" encoding="utf-8"?>
<wb xmlns:cf="http://www.macromedia.com/2004/cfform" xmlns:a="urn:dummy">
<a:form name="chart">
<a:fieldset FIELD="a" FIELDNAME="FieldSet1">
<a:select1 FIELDNUMBER="01" L="1" T="2" />
<a:input FIELDNUMBER="02" INDEX="4" L="200" T="1" />
</a:fieldset>
<a:fieldset FIELD="b" FIELDNAME="FieldSet1">
<a:select1 FIELDNUMBER="03" T="3" L="1" />
<a:input FIELDNUMBER="04" INDEX="7" T="4" L="200" />
<a:fieldset FIELD="c" FIELDNAME="FieldSet1">
<a:input FIELDNUMBER="05" T="10" INDEX="6" L="400" />
<a:input FIELDNUMBER="06" T="8" INDEX="8" L="200" />
</a:fieldset>
</a:fieldset>
<a:input FIELDNUMBER="08" INDEX="3" L="3" T="5" />
<a:input FIELDNUMBER="09" INDEX="2" L="2" T="5" />
</a:form>
</wb>
PS:
結果輸出應為以下內容:
<?xml version="1.0" encoding="utf-8"?>
<wb xmlns:cf="http://www.macromedia.com/2004/cfform" xmlns:a="urn:dummy">
<a:form name="chart">
<a:fieldset FIELD="a" FIELDNAME="FieldSet1">
<a:input FIELDNUMBER="02" INDEX="4" L="200" T="1" />
<a:select1 FIELDNUMBER="01" L="1" T="2" />
</a:fieldset>
<a:fieldset FIELD="b" FIELDNAME="FieldSet1">
<a:select1 FIELDNUMBER="03" T="3" L="1" />
<a:input FIELDNUMBER="04" INDEX="7" T="4" L="200" />
<a:fieldset FIELD="c" FIELDNAME="FieldSet1">
<a:input FIELDNUMBER="06" T="8" INDEX="8" L="200" />
<a:input FIELDNUMBER="05" T="10" INDEX="6" L="400" />
</a:fieldset>
</a:fieldset>
<a:input FIELDNUMBER="09" INDEX="2" L="2" T="5" />
<a:input FIELDNUMBER="08" INDEX="3" L="3" T="5" />
</a:form>
</wb>
為了更好地理解,我們可以假設L表示左,T表示頂。 因此,這樣做的想法是,當我查看轉換后的XML時,我可以立即注意到哪些元素先於哪些元素。
您對此有何看法?
試試這個:(如果我對您的問題不正確,請進行一些更改)
<xsl:template match="/wb">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="aaa" select="."/>
</xsl:copy>
</xsl:template>
<xsl:template match="*" mode="aaa">
<xsl:if test="child::*[1][not(@T) or not(@L)]">
<xsl:for-each select="child::*[not(@T) or not(@L)]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="aaa" select="."/>
</xsl:copy>
</xsl:for-each>
</xsl:if>
<xsl:variable name="sorted1">
<xsl:for-each select="a:*[@T and @L]">
<xsl:sort select="@T" data-type="number" order="ascending"></xsl:sort>
<xsl:copy>
<xsl:copy-of select="@*"/>
</xsl:copy>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="msxsl:node-set($sorted1)/*[not(@T=preceding-sibling::*/@T)]">
<xsl:variable name="tval" select="@T"/>
<xsl:for-each select="msxsl:node-set($sorted1)/*[@T=$tval]">
<xsl:sort select="@L" data-type="number" order="ascending"></xsl:sort>
<xsl:copy>
<xsl:copy-of select="@*"/>
</xsl:copy>
</xsl:for-each>
</xsl:for-each>
<xsl:if test="not(child::*[1][not(@T) or not(@L)])">
<xsl:for-each select="child::*[not(@T) or not(@L)]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="aaa" select="."/>
</xsl:copy>
</xsl:for-each>
</xsl:if>
</xsl:template>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.