0

私は xsl 変換が初めてで、Web 上で私の問題の解決策が実際に見つかりませんでした。

次のようなxmlファイルがあります。

<xml>
<id>1</id>
<value>abc</value>
<id>1</id>
<value>def</value>
<id>2</id>
<value>xyz</value>
<id>2</id>
<value>hij</value>
.
.
</xml>

次のような値が追加されたxmlが必要です。

 <xml>
<id>1</id>
<value>abc, def</value>
<id>2</id>
<value>xyz, hij</value>
.
.
</xml>

xsltでこれを行う方法について、誰かがこの問題について私を助けてくれますか?

私はあなたに与えた正確な形式を持っていません。実際には次のようになります。

<xml>
<objects>
<record>
<attribute>
<id>1</id>
<valuegroup>
<value>abc</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>1</id>
<valuegroup>
<value>def</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>2</id>
<valuegroup>
<value>hij</value>
</valuegroup>
</attribute>
</record>

 <record>
<attribute>
<id>2</id>
<valuegroup>
<value>xyz</value>
</valuegroup>
</attribute>
</record>
</objects>
</xml>

不注意で申し訳ありません。

4

1 に答える 1

1

Saxon 9、AltovaXML、XmlPrime などの XSLT 2.0 プロセッサを使用すると、

<xsl:template match="xml">
  <xsl:copy>
    <xsl:for-each-group select="value" group-by="preceding-sibling::id[1]">
      <id><xsl:value-of select="current-grouping-key()"/></id>
      <value><xsl:value-of select="current-group()" separator=", "/></value>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>

XSLT 1.0 の場合:

<xsl:key name="k1" match="xml/value" use="preceding-sibling::id[1]"/>

<xsl:template match="xml">
  <xsl:copy>
    <xsl:apply-templates select="value[generate-id() = generate-id(key('k1', preceding-sibling::id[1])[1])]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="value">
  <xsl:copy-of select="preceding-sibling::id[1]"/>
  <value>
    <xsl:for-each select="key('k1', preceding-sibling::id[1])">
      <xsl:if test="position() > 1"><xsl:text>, </xsl:text></xsl:if>
      <xsl:value-of select="."/>
    </xsl:for-each>
  </value>
</xsl:template>
于 2013-09-13T11:06:42.913 に答える