0

同じ名前のすべての要素ノードを取得し、それぞれの子要素を保持する1つにまとめるにはどうすればよいですか?

入力例:

<topic>
  <title />
  <language />
  <more-info>
    <itunes />
  </more-info>
  <more-info>
    <imdb />
  </more-info>
  <more-info>
    <netflix />
  </more-info>
</topic>

出力例(すべてのmore-infosが1つの要素に折りたたまれています):

<topic>
  <title />
  <language />
  <more-info>
    <itunes />
    <imdb />
    <netflix />
  </more-info>
</topic>

編集:どのノード名が再発するかを知らずにこれを行う方法を探しています。したがって、上記の例でmore-infoは、同じプロセスを適用する必要がある他の要素が存在する可能性があるため、ターゲットのみを対象としたスクリプトを使用できませんでした。

4

3 に答える 3

1

使用:

declare option saxon:output "omit-xml-declaration=yes";
<topic>
  <title />
  <language />
  <more-info>
   {for $inf in /*/more-info/node()
     return $inf
   }
  </more-info>
</topic>

この XQuery が提供された XML ドキュメントに適用されると、次のようになります。

<topic>
  <title />
  <language />
  <more-info>
    <itunes />
  </more-info>
  <more-info>
    <imdb />
  </more-info>
  <more-info>
    <netflix />
  </more-info>
</topic>

必要な正しい結果が生成されます。

<topic>
   <title/>
   <language/>
   <more-info>
      <itunes/>
      <imdb/>
      <netflix/>
   </more-info>
</topic>
于 2012-09-28T05:18:06.933 に答える
0

使用できるのであれば、XSLT のほうが適しているように思えます。

XML 入力

<topic>
    <title />
    <language />
    <more-info>
        <itunes />
    </more-info>
    <more-info>
        <imdb />
    </more-info>
    <more-info>
        <netflix />
    </more-info>
</topic>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:for-each-group select="*" group-by="name()">
                <xsl:copy>
                    <xsl:apply-templates select="current-group()/@*"/>
                    <xsl:apply-templates select="current-group()/*"/>
                </xsl:copy>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

XML 出力

<topic>
   <title/>
   <language/>
   <more-info>
      <itunes/>
      <imdb/>
      <netflix/>
   </more-info>
</topic>
于 2012-09-28T05:29:54.100 に答える