2013-05-05 78 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