1

別のxmlから設定されたヘッダー詳細XMLドキュメントを作成しようとしています。

ソースxmlドキュメント:

<items>
    <item>
        <col1>H</col1>
        <col2>header1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail1.1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail1.2</col2>
    </item>
    <item>
        <col1>H</col1>
        <col2>header2</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.2</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.3</col2>
    </item>
</items>

必要な出力:

<xml>
    <transaction>
        <items>
            <item>
                <col1>H</col1>
                <col2>header1</col2>
            </item>
            <item>
                <col1>D</col1>
                <col2>detail1.1</col2>
            </item>
            <item>
                <col1>D</col1>
                <col2>detail1.2</col2>
            </item>
        </items>
    </transaction>
    <transaction>
        <items>
            <item>
                <col1>H</col1>
                <col2>header2</col2>
            </item>
            <item>
                <col1>D</col1>
                <col2>detail2.1</col2>
            </item>
            <item>
                <col1>D</col1>
                <col2>detail2.2</col2>
            </item>
            <item>
                <col1>D</col1>
                <col2>detail2.3</col2>
            </item>
        </items>
    </transaction>
</xml>

私が試したXSLT:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/ | node() | @* | comment() | processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="item[col1='H']">
        <transaction>
            <xsl:apply-templates/>
        </transaction>
    </xsl:template>
</xsl:transform>
4

1 に答える 1

0

この変換

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

 <xsl:key name="kItemByCol2Num" match="item[starts-with(col2, 'detail')]"
  use="substring-before(substring-after(col2, 'detail'), '.')"/>

 <xsl:key name="kItemByCol2Num" match="item[starts-with(col2, 'header')]"
  use="substring-after(col2, 'header')"/>

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

 <xsl:template match=
 "item
   [starts-with(col2, 'header')
  and
    generate-id()
   =
    generate-id(key('kItemByCol2Num', substring-after(col2, 'header'))[1])
   ]">
  <transaction>
    <xsl:copy-of select="key('kItemByCol2Num', substring-after(col2, 'header'))"/>
  </transaction>
 </xsl:template>
 <xsl:template match="item"/>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合:

<items>
    <item>
        <col1>H</col1>
        <col2>header1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail1.1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail1.2</col2>
    </item>
    <item>
        <col1>H</col1>
        <col2>header2</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.1</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.2</col2>
    </item>
    <item>
        <col1>D</col1>
        <col2>detail2.3</col2>
    </item>
</items>

必要な正しい結果を生成します。

<items>
   <transaction>
      <item>
         <col1>H</col1>
         <col2>header1</col2>
      </item>
      <item>
         <col1>D</col1>
         <col2>detail1.1</col2>
      </item>
      <item>
         <col1>D</col1>
         <col2>detail1.2</col2>
      </item>
   </transaction>
   <transaction>
      <item>
         <col1>H</col1>
         <col2>header2</col2>
      </item>
      <item>
         <col1>D</col1>
         <col2>detail2.1</col2>
      </item>
      <item>
         <col1>D</col1>
         <col2>detail2.2</col2>
      </item>
      <item>
         <col1>D</col1>
         <col2>detail2.3</col2>
      </item>
   </transaction>
</items>

説明

  1. グループ化のためのMuenchianメソッドの適切な使用。

  2. キーの適切な使用。

于 2012-10-13T15:40:00.527 に答える