使用xsl对xml数据进行分组
下面是一个xml,我想使用xsl将其转换为以下结果。任何帮助,请。这是一些像windows目录结构。这里的目录深度是动态的使用xsl对xml数据进行分组,xml,xslt,Xml,Xslt,下面是一个xml,我想使用xsl将其转换为以下结果。任何帮助,请。这是一些像windows目录结构。这里的目录深度是动态的 <?xml version="1.0" encoding="UTF-8"?> <root> <qc name="accounting" level="1"> <qc name="fund" level="2"> <qc name="v1_0" level="3"/> </qc&
<?xml version="1.0" encoding="UTF-8"?>
<root>
<qc name="accounting" level="1">
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
<qc name="asset_allocation" level="1">
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
<qc name="asset_allocation" level="1">
<qc name="fund" level="2">
<qc name="v1_1" level="3"/>
</qc>
</qc>
<qc name="credit_quality" level="1">
<qc name="account" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
<qc name="credit_quality" level="1">
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
<qc name="credit_quality" level="1">
<qc name="v1_0" level="2"/>
</qc>
<qc name="credit_quality" level="1">
<qc name="v2_0" level="2"/>
</qc>
<qc name="portfolio" level="1">
<qc name="credit_quality" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
</root>
在上面的xml中,我使用了每个级别的名称。我想在同一级别对相同的名称进行分组
结果:
<root>
<qc name="accounting" level="1">
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
<qc name="asset_allocation" level="1">
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
<qc name="v1_1" level="3"/>
</qc>
</qc>
<qc name="credit_quality" level="1">
<qc name="account" level="2">
<qc name="v1_0" level="3"/>
</qc>
<qc name="fund" level="2">
<qc name="v1_0" level="3"/>
</qc>
<qc name="v1_0" level="2"/>
<qc name="v2_0" level="2"/>
</qc>
<qc name="portfolio" level="1">
<qc name="credit_quality" level="2">
<qc name="v1_0" level="3"/>
</qc>
</qc>
</root>
如果可以使用XSLT 2.0,请执行并使用xsl:for-each-group指令
如果您坚持使用XSLT1.0,请阅读有关Muenchian分组的内容。使用XSLT1.0和EXSLT函数的快速攻击可能如下所示。这可能不是最优雅的解决方案,但它应该会起作用
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:func="http://exslt.org/functions"
xmlns:my="my-namespace"
extension-element-prefixes="func"
exclude-result-prefixes="my">
<xsl:key name="qc-by-path" match="qc" use="my:path(.)"/>
<xsl:template match="root">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="qc">
<xsl:variable name="peers" select="key('qc-by-path', my:path(.))"/>
<xsl:if test="generate-id(.)=generate-id($peers[1])">
<qc name="{@name}" level="{@level}">
<xsl:apply-templates select="$peers/qc"/>
</qc>
</xsl:if>
</xsl:template>
<func:function name="my:path">
<xsl:param name="qc"/>
<xsl:choose>
<xsl:when test="$qc/parent::qc">
<func:result select="concat(my:path($qc/parent::qc),'/',$qc/@name)"/>
</xsl:when>
<xsl:otherwise>
<func:result select="$qc/@name"/>
</xsl:otherwise>
</xsl:choose>
</func:function>
</xsl:stylesheet>
到目前为止,您的XSL在哪里?