非常重要。
我读了许多XSLT实现,用于根据孩子对父节点进行分类。但是我找不到解决方案的解决方案。我想根据其子节点的(元素)值在多个级别上称为'sortfield'的元素节点。我有以下XML结构:
<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>