任务看起来很简单:按输入文件的值排序(本地)输入文档中的所有元素' id&#39 ;;否则内容应保持不变。
输入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>
请注意,排序是每个Group项的本地排序。这应该是非常简单的:
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>
问题是不受欢迎的换行。我用Saxon6.5.5,Saxon-PE 9.4.0.4,Saxon-HE 9.4.0.4,Saxon-EE 9.4.0.4获得了这个结果。 Xalan引入了相同的换行符以及额外的格式化。
我一直盯着自己,所以我很感激任何建议。
答案 0 :(得分:1)
使用<xsl:strip-space elements="*"/>
作为顶级元素。在这种情况下,*
是表示所有元素的通配符。相反,你可以列出你想要删除空格的特定元素。
<强> Stlysheet 强>
<?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>