我有一个场景,我只想对元素的一些子元素进行排序。也就是说,我想根据Sorted="1"
属性对具有field
属性的子项进行排序,而不是对具有Sorted="0"
的子项进行排序。
<?xml version="1.0" encoding="utf-8"?>
<root>
<Row field="G" Sorted="1" />
<Row field="A" Sorted="1" />
<Row field="B" Sorted="0" />
<Row field="H" Sorted="1" />
<Row field="D" Sorted="1" />
<Row field="M" Sorted="0" />
<Row field="U" Sorted="1" />
<Row field="W" Sorted="1" />
<Row field="Z" Sorted="0" />
<Row field="L" Sorted="1" />
<Row field="A" Sorted="0" />
<Row field="W" Sorted="1" />
</root>
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<xsl:copy>
<xsl:for-each select="/Row[@Sorted='1']">
<xsl:sort select="@field" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
<xsl:copy>
<xsl:for-each select="/Row[@Sorted='0']">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<root>
<Row field="A" Sorted="1" />
<Row field="D" Sorted="1" />
<Row field="G" Sorted="1" />
<Row field="H" Sorted="1" />
<Row field="L" Sorted="1" />
<Row field="U" Sorted="1" />
<Row field="W" Sorted="1" />
<Row field="W" Sorted="1" />
<Row field="B" Sorted="0" />
<Row field="M" Sorted="0" />
<Row field="Z" Sorted="0" />
<Row field="A" Sorted="0" />
</root>
答案 0 :(得分:1)
回复您的更新问题:
使用Sorted = 1对行进行排序,并将它们复制到顶部并复制其余部分 在xml未排序
的底部排序= 0的行
这可以简单地完成:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="Row[@Sorted='1']">
<xsl:sort select="@field" data-type="text" order="ascending"/>
</xsl:apply-templates>
<xsl:apply-templates select="Row[@Sorted='0']"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,如果您愿意:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each select="Row[@Sorted='1']">
<xsl:sort select="@field" data-type="text" order="ascending"/>
<xsl:copy-of select="."/>
</xsl:for-each>
<xsl:for-each select="Row[@Sorted='0']">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>