0

我被分配了一个新项目来使用 XSLT 样式表将一个 XML 文档转换为另一种 XML 格式。

在过去的四个小时里,我一直在搜索 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>

我能够毫无问题地复制所有元素。我遇到困难的地方是我只需要customerandjobType元素的第一次出现,但是JobParts多个estimate块中包含的所有内容,按照它们在jobPart元素中的顺序正确编号。

如果有人能在这个项目上为我指明正确的方向,我将不胜感激,因为我自己没有任何进展。

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 回答