1


xslt を使用する必要があり、どこから始めればよいかわかりません。少なくとも手がかりを教えていただければ幸いです。

ソース xml

<ROW>
    <DEPT> A </DEPT>
</ROW>
<ROW>
    <DEPT> B </DEPT>
</ROW>
<ROW>
    <DEPT> A </DEPT>
</ROW>

ターゲット xml

<DEPTARTMENT>
    <ROW>
        <DEPT> A </DEPT>
    </ROW>
    <ROW>
        <DEPT> A </DEPT>
    </ROW>
</DEPARTMENT>
<DEPTARTMENT>
    <ROW>
        <DEPT> B </DEPT>
    </ROW>
</DEPARTMENT>

アドバイスをありがとう。

4

1 に答える 1

3

これは考えられる XSLT 1.0 ソリューションです。

この XSLT の場合:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="kRowByDept" match="ROW" use="DEPT"/>

  <xsl:template match="/*">
    <T>
      <xsl:apply-templates
        select="ROW[generate-id() = generate-id(key('kRowByDept', DEPT)[1])]"/>
    </T>
  </xsl:template>

  <xsl:template match="ROW">
    <DEPARTMENT>
      <xsl:copy-of select="key('kRowByDept', DEPT)"/>
    </DEPARTMENT>
  </xsl:template>
</xsl:stylesheet>

...提供された XML に対して適用されます (ドキュメントを整形式にするために最上位の要素にラップされます)。

<T>
  <ROW>
    <DEPT> A </DEPT>
  </ROW>
  <ROW>
    <DEPT> B </DEPT>
  </ROW>
  <ROW>
    <DEPT> A </DEPT>
  </ROW>
</T>

...目的のソリューションが生成されます。

<T>
  <DEPARTMENT>
    <ROW>
      <DEPT> A </DEPT>
    </ROW>
    <ROW>
      <DEPT> A </DEPT>
    </ROW>
  </DEPARTMENT>
  <DEPARTMENT>
    <ROW>
      <DEPT> B </DEPT>
    </ROW>
  </DEPARTMENT>
</T>

説明:

これは、要素をグループ化するための XSLT 1.0 固有の方法であるMuenchian Groupingを使用するソリューションです。


これは、類似の XSLT 2.0 ソリューションです。はるかに簡単であることに注意してください。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <T>
      <xsl:for-each-group select="ROW" group-by="DEPT">
        <DEPARTMENT>
          <xsl:copy-of select="current-group()" />
        </DEPARTMENT>
      </xsl:for-each-group>
    </T>
  </xsl:template>

</xsl:stylesheet>
于 2013-05-07T14:15:38.053 に答える