XSLT,XML:按属性值分组
使用XSLT根据属性值对元素进行分组的最佳方式是什么? 使用XSLT 2.0或更高版本会更好吗?XSLT,XML:按属性值分组
许多预先感谢您的帮助
托马斯
原始XML
:
<transaction>
<record type="1" >
<field number="1" >
<item >223</item>
</field>
</record>
<record type="14" >
<field number="1" >
<item >777</item>
</field>
</record>
<record type="14" >
<field number="1" >
<item >555</item>
</field>
</record>
</transaction>
分组之后的结果:
<transaction>
<records type="1" >
<record type="1" >
<field number="1" >
<item >223</item>
</field>
</record>
</records>
<records type="14" >
<record type="14" >
<field number="1" >
<item >777</item>
</field>
</record>
<record type="14" >
<field number="1" >
<item >555</item>
</field>
</record>
</records>
</transaction>
在XSLT 2.0中,您可以使用xsl:for-each-group
,但是如果您打算执行<xsl:for-each-group select="record" group-by="@type">
,那么您必须将该位置记录在transaction
记录中。
此外,您将需要使用current-group
获取组中的所有record
元素。
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="transaction">
<xsl:copy>
<xsl:for-each-group select="record" group-by="@type">
<records type="{current-grouping-key()}" >
<xsl:apply-templates select="current-group()" />
</records>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Hi Tim,很棒的工作。非常感谢您的支持:-)最好的问候,托马斯 – ThomasMuller
您好,我添加了一个新的问题:https://stackoverflow.com/questions/46767754/xslt-xml-how-to-disentangle-grouped-blocks-进入扁平层次 任何建议将不胜感激。 在此先感谢 Thomas – ThomasMuller
的答案是 “是”。如果您能够使用XSLT 2.0,那么使用它几乎肯定会更好。在这种情况下,你可以使用'xsl:for-each-group'结构,这使得分组更容易。所以,在这种情况下,你会做' ' –
Hi Tim! 非常感谢您的快速回复。 我用下面的模板尝试了: 的 \t \t \t \t \t的 \t \t的xsl:for-各个群组> XSL:模板> \t \t的 \t \t \t \t \t \t \t \t XSL:模板> XSL:样式> 结果XML只包含根元素。 非常感谢您的帮助。 Thomas transaction> –
ThomasMuller