[英]XSLT sort child nodes under different parent nodes
我正在尝试使用xslt对xml进行排序,但是问题是我的代码仅对特定节点下的元素进行了排序,这是一个示例xml:
<region name="Germany">
<company name="Mercedes" rank="2" />
<company name="BMW" rank="3" />
</region>
<region name="Japan">
<company name="Toyota" rank="1" />
<company name="Mazda" rank="4" />
</region>
我尝试了以下操作,但没有成功
<xsl:template match="region">
<Companies>
<xsl:for-each select="company">
<xsl:sort select="@rank" />
<xsl:call-template name="companies">
</xsl:for-each>
</Companies>
</xsl:template>
<xsl:template name="companies">
<Company>
<xsl:value-of select="@name" />
</Company>
</xsl:template>
输出应为:
<Companies>
<Company>Toyota</Company>
<Company>Mercedes</Company>
<Company>BMW</Company>
<Company>Mazda</Company>
</Companies>
从输出看来,您似乎要按等级而不是名称进行排序。
关于随节点进行的排序,因为您的模板正在每个区域运行,所以排序是针对一个区域内的公司节点。 您可以为区域的父级运行模板,然后遍历元素并按名称排序。 这是带有匹配输出的模板。
<xsl:template match="*[region]">
<Companies>
<xsl:for-each select="region/company">
<xsl:sort select="@rank" />
<xsl:call-template name="companies" />
</xsl:for-each>
</Companies>
</xsl:template>
<xsl:template name="companies">
<Company>
<xsl:value-of select="@name" />
</Company>
</xsl:template>
您没有显示这些region
元素的任何容器元素,但是假设您将它们包含在一个公共容器中,请编写一个与该容器匹配的模板(例如,在下面的示例代码中命名为root
),然后我建议将模板应用于company
根据rank
属性包含xsl:sort
孙子代。
然后添加一个模板,该模板从基于属性的company
输入元素转换为基于值的元素,您将完成:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<Companies>
<xsl:apply-templates select="region/company">
<xsl:sort select="xs:integer(@rank)"/>
</xsl:apply-templates>
</Companies>
</xsl:template>
<xsl:template match="company">
<xsl:copy>
<xsl:value-of select="@name"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/94rmq6B
如果要以一种排序的方式一起处理所有region
则在每个region
匹配似乎没有任何意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.