任务似乎很简单:按属性"id"的值对输入文档中的所有元素进行排序(本地);否则内容应保持不变。
输入 XML
<?xml version="1.0" encoding="utf-8"?>
<A>
<Group>
<Item id="c"/>
<Item id="a"/>
<Item id="b"/>
</Group>
<Group>
<Item id="f"/>
<Item id="d"/>
</Group>
</A>
期望的输出
<?xml version="1.0" encoding="utf-8"?>
<A>
<Group>
<Item id="a"/>
<Item id="b"/>
<Item id="c"/>
</Group>
<Group>
<Item id="d"/>
<Item id="f"/>
</Group>
</A>
请注意,排序是每个组项目的本地排序。这应该使这非常简单:
XSLT
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<!-- Modified identity -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@id" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:transform>
实际输出
<?xml version="1.0" encoding="utf-8"?>
<A>
<Group>
<Item id="a"/>
<Item id="b"/>
<Item id="c"/>
</Group>
<Group>
<Item id="d"/>
<Item id="f"/>
</Group>
</A>
问题是不需要的换行符。我用撒克逊6.5.5,撒克逊-PE 9.4.0.4,撒克逊-HE 9.4.0.4,撒克逊-EE 9.4.0.4获得此结果。Xalan 引入了相同的换行符以及额外的格式污垢。
我一直盯着自己看,所以如果有任何建议,我将不胜感激。
使用 <xsl:strip-space elements="*"/>
作为顶级元素。在这种情况下,*
是表示所有元素的通配符。相反,您可以列出要去除其空格的特定元素。
斯特利表
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:strip-space elements="*"/>
<!-- Modified identity -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@id" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:transform>
输出
<?xml version="1.0" encoding="utf-8"?>
<A>
<Group>
<Item id="a"/>
<Item id="b"/>
<Item id="c"/>
</Group>
<Group>
<Item id="d"/>
<Item id="f"/>
</Group>
</A>