[英]XSLT 1.0 sort elements
我有以下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"/>
?
原因在于:
<parts> <xsl:apply-templates> <xsl:sort select="object"/> </xsl:apply-templates> </parts>
这适用模板的儿童( object
当前节点()的objects
),并通过他们的第一个字符串值对其进行排序object
的孩子。
但是,在提供的XML文档中, object
没有任何object
子object
- 因此它们都具有相同的排序键 - 空字符串 - 并且它们的原始顺序不会被排序操作更改。
方案 :
<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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.