我对XSLT的基础知识很熟悉,但是我已经遇到了一个奇怪的情况,我似乎无法弄清楚。对于这么长的时间,我深表歉意,但我真的很感谢您提供的任何帮助。
我想根据排序的brand/valial/@name和doc/value/@名称的串联来对latve_5节点进行排序_5节点
XML unsorted:
<Root att="x">
<Level_1 Name="NEW Level">
<Level_2>
<Level_3 Name="nameLvl_3">
<Level_4>
<Level_5 Name="aa">
<Brand>
<Value Name="Text" Value="1" />
</Brand>
<Docs>
<Value Name="Pro" Value="2" />
<Value Name="Numeric" Value="0.05" />
</Docs>
</Level_5>
<Level_5 Name="aa">
<Text>
<Val Id="1"/>
</Text>
</Level_5>
<Level_5 Name="aa">
<Brand>
<Value Name="Text" Value="2" />
<Value Name="Number" Value="1" />
<Value Name="Long" Value="3" />
</Brand>
</Level_5>
</Level_4>
</Level_3>
</Level_2>
</Level_1>
</Root>
执行串联后,您应该拥有",longnumberText,textnumericpro预期的输出为:
<Root att="x">
<level_1 Name="NEW Level">
<level_2>
<Level_3 Name="nameLvl_3">
<Level_4>
<Level_5 Name="aa">
<Text>
<Val Id="1"/>
</Text>
</Level_5>
<Level_5 Name="aa">
<Brand>
<Value Name="Long" Value="3" />
<Value Name="Number" Value="1" />
<Value Name="Text" Value="2" />
</Brand>
</Level_5>
<Level_5 Name="aa">
<Brand>
<Value Name="Text" Value="1" />
</Brand>
<Docs>
<Value Name="Numeric" Value="0.05" />
<Value Name="Pro" Value="2" />
</Docs>
</Level_5>
</Level_4>
</Level_3>
</Level_2>
</Level_1>
</Root>
我只能按/brand/value/@name的第一个元素进行排序,但我不知道品牌和文档中其余的属性如何加以串通,这是代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Level_3/Level_4/Level_5/Brand|Docs">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort select="@Name" data-type="text"/>
<xsl:sort select="@Value" data-type="text"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<!-- -->
<xsl:template match="Level_2/Level_3/Level_4">
<xsl:copy>
<xsl:apply-templates select="Level_5">
<xsl:sort select="Brand|Docs/Value/@Name" data-type="text"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
,但我只是将品牌或文档内部的第一个元素排序,请
可能有一种巧妙的方式可以在XPath 1.0表达式中进行此操作,但我没有看到一个。一种更直接的方法是分两个步骤处理数据。
首先编写执行近乎身份变换的样式表:输入只是将其写回输出,但是在每个级别_5元素上,您添加一个用sort-key添加属性,您可以通过处理所有内容来构建它们适当的儿童以钥匙模式。
然后编写其他样式表并使用sort-key属性来控制排序(如果您不希望它再次将其放置)。
在另一个主题上:匹配模式Level_3/Level_4/Level_5/Brand | Docs
不等于Level_3/Level_4/Level_5/Brand | Level_3/Level_4/Level_5/Docs
。如果您的意思是后者,则需要不同的匹配模式。