XSLT - 根据多个级别上的子节点对父节点进行排序
问题描述:
我已经阅读了许多基于子节点对父节点进行排序的XSLT实现。但我没有找到适合我的案例的工作解决方案。我想根据在多个级别上的子节点的(元素)值(称为“SortField”)对ElementRef节点进行排序。我有以下XML结构:XSLT - 根据多个级别上的子节点对父节点进行排序
<Root>
<OtherElement1></OtherElement1>
<Group>
<ID></ID>
<Name></Name>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>B</SortField>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>H</SortField>
<ElementRef>
[...]
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>F</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>G</SortField>
</Element>
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>C</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>A</SortField>
</Element>
</ElementRef>
</Group>
<OtherElement2></OtherElement2>
</Root>
而且结果应该是这样的:
<Root>
<OtherElement1></OtherElement1>
<Group>
<ID></ID>
<Name></Name>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>A</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>B</SortField>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>F</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>G</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>H</SortField>
<ElementRef>
[...]
</ElementRef>
</Element>
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>C</SortField>
</Element>
</ElementRef>
</Group>
<OtherElement2></OtherElement2>
</Root>
你能为我提供了一个工作XSLT?
请注意:所有其他元素和属性保持不变非常重要!
答
使用模板与xsl:sort
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* |node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[ElementRef]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="*">
<xsl:sort select="Element/SortField" data-type="text"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这将输入
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<OtherElement1></OtherElement1>
<Group>
<ID></ID>
<Name></Name>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>B</SortField>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>H</SortField>
<ElementRef>
[...]
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>F</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>G</SortField>
</Element>
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>C</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID></ID>
<Element>
<ID></ID>
<Name></Name>
<SortField>A</SortField>
</Element>
</ElementRef>
</Group>
<OtherElement2></OtherElement2>
</Root>
到输出
<?xml version="1.0" encoding="utf-8"?>
<Root>
<OtherElement1/>
<Group>
<ID/>
<Name/>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>A</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>B</SortField>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>F</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>G</SortField>
</Element>
</ElementRef>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>H</SortField>
<ElementRef>
[...]
</ElementRef>
</Element>
</ElementRef>
</Element>
</ElementRef>
<ElementRef>
<ID/>
<Element>
<ID/>
<Name/>
<SortField>C</SortField>
</Element>
</ElementRef>
</Group>
<OtherElement2/>
</Root>
该解决方案对我不起作用。什么都没有排序。我从来没有见过这样的行:''。这可能是问题吗? –
user3452015
@ user3452015,我已经添加了我为您发布的输入获取的输出,该输出已排序。 –
是的,你说得对,谢谢! – user3452015