我有以下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>
Run Code Online (Sandbox Code Playgroud)
以下是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>
Run Code Online (Sandbox Code Playgroud)
应用时,我按预期获得以下输出,但它没有被排序:
<?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>
Run Code Online (Sandbox Code Playgroud)
为什么<xsl:sort select="object"/>
不适用?
原因在于:
Run Code Online (Sandbox Code Playgroud)<parts> <xsl:apply-templates> <xsl:sort select="object"/> </xsl:apply-templates> </parts>
这将模板应用于object
当前节点(objects
)的children(),并按其第一object
个子节点的字符串值对它们进行排序.
但是,在提供的XML文档object
中,没有任何子项object
- 因此它们都具有相同的排序键 - 空字符串 - 并且它们的原始顺序不会被排序操作更改.
方案:
<parts>
<xsl:apply-templates>
<xsl:sort select="."/>
</xsl:apply-templates>
</parts>
Run Code Online (Sandbox Code Playgroud)
完整的转变成为:
<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>
Run Code Online (Sandbox Code Playgroud)
当它应用于提供的XML文档时:
<objects>
<object>Clutch</object>
<object>Gearbox</object>
<object>Cylinder head</object>
<object>Starter</object>
<object>Airbox</object>
<object>Inlet manifold</object>
</objects>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<parts>
<part>Airbox</part>
<part>Clutch</part>
<part>Cylinder head</part>
<part>Gearbox</part>
<part>Inlet manifold</part>
<part>Starter</part>
</parts>
Run Code Online (Sandbox Code Playgroud)