0

XSLT スタイルシートを使用して 1 つの XML ドキュメントを別の XML 形式に変換する新しいプロジェクトが割り当てられました。

過去 4 時間、StackOverflow やその他のオンラインのアーカイブを調べて、目的の結果を達成する方法を見つけようとしましたが、正しい方向を示すものは何も見つかりませんでした。

元のドキュメント形式は次のとおりです。

<?xml version="1.0"?>
<PODOrderSheet_Main>
    <estimate>
        <customer>LINFNC</customer>
        <jobType>5020</jobType>
        <JobParts>
            <JobPart>
                <jobPart>01</jobPart>
                <contactNum/>
                <JobNotes>
                    <JobNote>
                        <department>001</department>
                        <jobPart>01</jobPart>
                        <note><![CDATA[Rush Order]]></note>
                    </JobNote>
                </JobNotes>
            </JobPart>
        </JobParts>
    </estimate>
    <estimate>
        <customer>LINFNC</customer>
        <jobType>5020</jobType>
        <JobParts>
            <JobPart>
                <jobPart>01</jobPart>
                <contactNum/>
                <JobNotes>
                    <JobNote>
                        <department>001</department>
                        <jobPart>01</jobPart>
                        <note><![CDATA[Rush Order]]></note>
                    </JobNote>
                </JobNotes>
            </JobPart>
        </JobParts>
    </estimate>
    <estimate>
        <customer>LINFNC</customer>
        <jobType>5020</jobType>
        <JobParts>
            <JobPart>
                <jobPart>01</jobPart>
                <contactNum/>
                <JobNotes>
                    <JobNote>
                        <department>001</department>
                        <jobPart>01</jobPart>
                        <note><![CDATA[Rush Order]]></note>
                    </JobNote>
                </JobNotes>
            </JobPart>
        </JobParts>
    </estimate>
</PODOrderSheet_Main>

そして、これがどのように見える必要があるかです:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE estimate>
<estimate>
    <customer>LINFNC</customer>
    <jobType>5020</jobType>
    <JobParts>
        <JobPart>
            <jobPart>01</jobPart>
            <contactNum/>
            <JobNotes>
                <JobNote>
                    <department>001</department>
                    <jobPart>01</jobPart>
                    <note><![CDATA[Rush Order]]></note>
                </JobNote>
            </JobNotes>
        </JobPart>
        <JobPart>
            <jobPart>02</jobPart>
            <contactNum/>
            <JobNotes>
                <JobNote>
                    <department>001</department>
                    <jobPart>02</jobPart>
                    <note><![CDATA[Rush Order]]></note>
                </JobNote>
            </JobNotes>
        </JobPart>
        <JobPart>
            <jobPart>03</jobPart>
            <contactNum/>
            <JobNotes>
                <JobNote>
                    <department>001</department>
                    <jobPart>03</jobPart>
                    <note><![CDATA[Rush Order]]></note>
                </JobNote>
            </JobNotes>
        </JobPart>
    </JobParts>
</estimate>

すべての要素を問題なくコピーできます。私が立ち往生しているのは、customerand要素の最初の出現だけが必要ですが、複数のブロックからjobType含まれているすべての要素に、要素に収まる順序で正しく番号が付けられていることです。JobPartsestimatejobPart

私は自分でどこにも行けないので、誰かがこのプロジェクトで正しい方向に私を向けることができれば、私は非常に感謝しています.

4

1 に答える 1

0

これはグループ化の問題ではないようです。私が見る限り、最初customerjobType要素と出力の先頭にコピーされた要素だけが必要です。JobPartその後は、すべての要素の単なるコピーです。(ちょっと厄介jobPartな落とし穴が待っている) 要素は、ソース データに含まれる要素に従って番号を付けるため jの独自のテンプレートを取得します。JobPart

この変換は、必要なことを行うようです

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="/PODOrderSheet_Main">
        <estimate>
            <xsl:copy-of select="estimate[1]/customer"/>
            <xsl:copy-of select="estimate[1]/jobType"/>
            <JobParts>
                <xsl:apply-templates select="estimate/JobParts/JobPart"/>
            </JobParts>
        </estimate>
    </xsl:template>

    <xsl:template match="jobPart">
        <xsl:copy><xsl:number count="JobPart" level="any" format="01"/></xsl:copy>
    </xsl:template>

</xsl:stylesheet>

出力

<?xml version="1.0" encoding="utf-8"?>
<estimate>
   <customer>LINFNC</customer>
   <jobType>5020</jobType>
   <JobParts>
      <JobPart>
         <jobPart>01</jobPart>
         <contactNum/>
         <JobNotes>
            <JobNote>
               <department>001</department>
               <jobPart>01</jobPart>
               <note>Rush Order</note>
            </JobNote>
         </JobNotes>
      </JobPart>
      <JobPart>
         <jobPart>02</jobPart>
         <contactNum/>
         <JobNotes>
            <JobNote>
               <department>001</department>
               <jobPart>02</jobPart>
               <note>Rush Order</note>
            </JobNote>
         </JobNotes>
      </JobPart>
      <JobPart>
         <jobPart>03</jobPart>
         <contactNum/>
         <JobNotes>
            <JobNote>
               <department>001</department>
               <jobPart>03</jobPart>
               <note>Rush Order</note>
            </JobNote>
         </JobNotes>
      </JobPart>
   </JobParts>
</estimate>
于 2013-05-04T21:09:29.093 に答える