2013-05-05 113 views
1

我需要将XML从一个结构转换到另一个结构。我不知道如何做到这一点。第一个xml看起来不像主细节,但最终的结果需要看起来像肥大的细节。XSL转换 - 主细节

<?xml version = '1.0' encoding = 'UTF-8'?> 
    <Root-Element xmlns="http://example.com/ReadProductB"> 
     <RECORD1> 
      <C2>QGGG9.A1-1</C2> 
     </RECORD1> 
     <RECORD2> 
      <C2>xflowcode</C2> 
      <C3>FL1</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xtilo</C2> 
      <C3>1234</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xwat</C2> 
      <C3>75</C3> 
     </RECORD2> 
     <RECORD1> 
      <C2>QGGG9.A1-2</C2> 
     </RECORD1> 
     <RECORD2> 
      <C2>xflowcode</C2> 
      <C3>FL1</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xtilo</C2> 
      <C3>1234</C3> 
     </RECORD2> 
     <RECORD2> 
      <C2>xwat</C2> 
      <C3>75</C3> 
     </RECORD2> 
    </Root-Element> 

这是我想要的结果。

<?xml version = '1.0' encoding = 'UTF-8'?> 
    <ns0:ProductCollection xmlns:ns0="http://example.com/ReadProductBB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
     <ns0:RECORD1> 
      <ns0:C2>QGGG9.A1-1</ns0:C2> 
      <ns0:RECORD2Collection> 
      <ns0:RECORD2> 
       <ns0:C2>xflowcode</ns0:C2> 
       <ns0:C3>FL1</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xtilo</ns0:C2> 
       <ns0:C3>1234</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xwat</ns0:C2> 
       <ns0:C3>75</ns0:C3> 
      </ns0:RECORD2> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
     <ns0:RECORD1> 
      <ns0:C2>QGGG9.A1-2</ns0:C2> 
      <ns0:RECORD2Collection> 
      <ns0:RECORD2> 
       <ns0:C2>xflowcode</ns0:C2> 
       <ns0:C3>FL1</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xtilo</ns0:C2> 
       <ns0:C3>1234</ns0:C3> 
      </ns0:RECORD2> 
      <ns0:RECORD2> 
       <ns0:C2>xwat</ns0:C2> 
       <ns0:C3>75</ns0:C3> 
      </ns0:RECORD2> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
    </ns0:ProductCollection> 

请帮忙。由于

回答

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:b="http://example.com/ReadProductB" 
    xmlns:bb="http://example.com/ReadProductBB" 
    version="1.0"> 
    <xsl:output indent="yes"/> 

    <!-- 
     identity template 
     https://en.wikipedia.org/wiki/Identity_transform 
    --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- 
     converts elements from the namespace "http://example.com/ReadProductB" 
     to "http://example.com/ReadProductBB" 
    --> 
    <xsl:template match="b:*"> 
     <xsl:element name="bb:{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="b:Root-Element"> 
     <!--Convert b:Root-Element into bb:ProductCollection--> 
     <bb:ProductCollection> 
      <!--and then "push" only the b:RECORD1 elements --> 
      <xsl:apply-templates select="b:RECORD1"/> 
     </bb:ProductCollection> 
    </xsl:template> 

    <xsl:template match="b:RECORD1"> 
     <!--Convert the RECORD1 to new namespace --> 
     <bb:RECORD1> 
      <!-- "push" it's children 
      (which will match the generic templates above)--> 
      <xsl:apply-templates select="@*|node()"/> 
      <bb:RECORD2Collection> 
       <!--and "push" the RECORD2 elements that are 
       between this RECORD1 element and the next(or the end) --> 
       <xsl:apply-templates select="following-sibling::b:RECORD2 
         [generate-id(preceding-sibling::b:RECORD1[1]) 
         = generate-id(current())]" /> 
      </bb:RECORD2Collection> 
     </bb:RECORD1> 
    </xsl:template> 

</xsl:stylesheet> 
+1

道歉。我对我的问题有点模糊。我对所有这些东西都很陌生,所以没有意识到如何正确地形成我的问题。下次我会努力加倍努力。 – user2351802 2013-05-05 22:55:06

+0

我在这个问题上挣扎了好几天,你们很快提出了解决方案/建议。荣誉给你。非常感谢您的帮助。我实际上有我想要的xml的xsd。我明天会试一试你的建议,然后回来。现在有点深夜。 – user2351802 2013-05-05 22:57:48

+0

我意识到我忽略在输出中包含'',对我的答案进行了更新。 – 2013-05-05 23:49:06

1

这个样式表使用通用的模板移动原始元素的名称相同的名称空间ns0

RECORD2元件配对与他们通过使用generate-id识别当前RECORD1对应RECORD1元件,然后处理所有以下RECORD2元件,其第一RECORD1元件之前具有相同的ID。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:src="http://example.com/ReadProductB" 
    xmlns:ns0="http://example.com/ReadProductBB" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="src" 
    version="1.0"> 

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

    <xsl:template match="/src:Root-Element"> 
     <ns0:ProductCollection> 
      <xsl:apply-templates select="src:RECORD1"/> 
     </ns0:ProductCollection> 
    </xsl:template> 

    <xsl:template match="src:RECORD1"> 
     <ns0:RECORD1> 
      <xsl:apply-templates/> 
      <xsl:variable name="record1" select="generate-id()"/> 
      <ns0:RECORD2Collection> 
       <xsl:for-each select="following-sibling::src:RECORD2"> 
        <xsl:if test="generate-id(preceding-sibling::src:RECORD1[1]) = $record1"> 
         <xsl:apply-templates select="."/> 
        </xsl:if> 
       </xsl:for-each> 
      </ns0:RECORD2Collection> 
     </ns0:RECORD1> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="ns0:{local-name(current())}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

输出

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:ProductCollection xmlns:ns0="http://example.com/ReadProductBB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <ns0:RECORD1> 
     <ns0:C2>QGGG9.A1-1</ns0:C2> 
     <ns0:RECORD2Collection> 
     <ns0:RECORD2> 
      <ns0:C2>xflowcode</ns0:C2> 
      <ns0:C3>FL1</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xtilo</ns0:C2> 
      <ns0:C3>1234</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xwat</ns0:C2> 
      <ns0:C3>75</ns0:C3> 
     </ns0:RECORD2> 
     </ns0:RECORD2Collection> 
    </ns0:RECORD1> 
    <ns0:RECORD1> 
     <ns0:C2>QGGG9.A1-2</ns0:C2> 
     <ns0:RECORD2Collection> 
     <ns0:RECORD2> 
      <ns0:C2>xflowcode</ns0:C2> 
      <ns0:C3>FL1</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xtilo</ns0:C2> 
      <ns0:C3>1234</ns0:C3> 
     </ns0:RECORD2> 
     <ns0:RECORD2> 
      <ns0:C2>xwat</ns0:C2> 
      <ns0:C3>75</ns0:C3> 
     </ns0:RECORD2> 
     </ns0:RECORD2Collection> 
    </ns0:RECORD1> 
</ns0:ProductCollection> 
+0

非常感谢。真的很感激。你的反应时间令人难以置信。我会尽力解决您的问题并尽快回复您。我有我应该发布的结果xml的xsd。对于所有这些,我只是新的道歉。 – user2351802 2013-05-05 23:00:05

+0

既然你们这么好,你能否给我一个建议,最好的方法是学习所有这些东西。我知道经验很重要,但如何做出一个好的开始。有没有在线课程?再次感谢。 – user2351802 2013-05-05 23:01:49

+0

XSLT是我遇到过的记录最差的语言之一。 [规范](http://www.w3.org/TR/xslt)相当难以理解,大多数教程都很肤浅,而[W3Schools](http://www.w3schools.com/xsl/)是最好的之一。我想知道为什么你删除了对我的答案的接受。它有问题吗? – Borodin 2013-05-05 23:45:51