2013-05-04 72 views
0

我已经分配了一个新项目来使用XSLT样式表将一个XML文档转换为另一种XML格式。XSLT for XML to 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> 

我能够在没有任何问题的所有元素进行复制。我陷入困境的是,我只需要第一次出现customerjobType元素,但是包含来自多个estimate块的JobParts中的所有元素,其编号正确的顺序均落在jobPart元素中。

如果有人能够指出我在这个项目的正确方向,我会非常感激,因为我没有自己的任何地方。

+0

这是分组问题的一个例子,所以应该不会太难解决。您是使用XSLT1.0还是XSLT2.0,因为它如何解决它的不同?另外,为了清楚起见,客户可以有不同的'jobType'元素吗?在这种情况下,你想让他们单独分组还是一起分组?谢谢! – 2013-05-04 18:43:53

+0

输入示例似乎不匹配输出。例如。你的输入中没有“”等。 – 2013-05-04 18:55:04

+0

你好。感谢您的回应。这是XSLT 1.0,jobType元素将始终是从第一个估算块收集的元素。 – 2013-05-04 18:56:07

回答

0

这在我看来不是一个分组问题。据我所见,您只需要将第一个customerjobType元素复制到输出的开头。此后它只是所有JobPart元素的副本。 jobPart(有一个j - 等待那里讨厌gotcha)元素得到自己的模板来根据源数据中包含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> 
+0

这工作出色。谢谢你的帮助。现在,我必须努力将文本字符串预先添加和附加到一些复制的值,但是这使我实现了自己的目标。再次感谢您花时间向我展示如何正确执行此操作。 – 2013-05-05 00:27:20