1

これは、xslを使用して以下の結果に変換したいxmlです。何か助けてください。これは、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>
</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>
4

2 に答える 2

2

XSLT 2.0 を使用できる場合は、xsl:for-each-group 命令を使用してください。

XSLT 1.0 に行き詰まっている場合は、Muenchian のグループ化について読んでください。

于 2012-04-20T22:59:47.983 に答える
1

XSLT 1.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>
于 2012-04-21T08:08:40.663 に答える