我有以下XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<objects>
<object>Clutch</object>
<object>Gearbox</object>
<object>Cylinder head</object>
<object>Starter</object>
<object>Airbox</object>
<object>Inlet manifold</object>
</objects>
以下XSLT文档:
<?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="objects">
<parts>
<xsl:apply-templates>
<xsl:sort select="object"/>
</xsl:apply-templates>
</parts>
</xsl:template>
<xsl:template match="object">
<part>
<xsl:apply-templates/>
</part>
</xsl:template>
</xsl:stylesheet>
应用后,我按预期获得以下输出,但未进行排序:
<?xml version="1.0" encoding="UTF-8"?>
<parts>
<part>Clutch</part>
<part>Gearbox</part>
<part>Cylinder head</part>
<part>Starter</part>
<part>Airbox</part>
<part>Inlet manifold</part>
</parts>
为什么<xsl:sort select="object"/>
没有被应用?
答案 0 :(得分:8)
原因在于:
<parts> <xsl:apply-templates> <xsl:sort select="object"/> </xsl:apply-templates> </parts>
这会将模板应用于当前节点(object
)的子项(objects
),并按其第一个object
子项的字符串值对其进行排序。
但是,在提供的XML文档中,object
没有任何object
子项 - 因此它们都具有相同的排序键 - 空字符串 - 并且它们的原始顺序是'n'由排序操作改变。
<强>解决方案强>:
<parts>
<xsl:apply-templates>
<xsl:sort select="."/>
</xsl:apply-templates>
</parts>
完整转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="objects">
<parts>
<xsl:apply-templates>
<xsl:sort select="."/>
</xsl:apply-templates>
</parts>
</xsl:template>
<xsl:template match="object">
<part>
<xsl:apply-templates/>
</part>
</xsl:template>
</xsl:stylesheet>
,当它应用于提供的XML文档时:
<objects>
<object>Clutch</object>
<object>Gearbox</object>
<object>Cylinder head</object>
<object>Starter</object>
<object>Airbox</object>
<object>Inlet manifold</object>
</objects>
产生了想要的正确结果:
<parts>
<part>Airbox</part>
<part>Clutch</part>
<part>Cylinder head</part>
<part>Gearbox</part>
<part>Inlet manifold</part>
<part>Starter</part>
</parts>