2012-09-02 116 views
1

我的輸入xml有很少的節點沒有正確的分組..他們只是以串行方式。 我需要創建一個父節點,並把它們放在下面的結構中,使用XSLT ....我試着沒有任何運氣。反過來似乎很容易。任何人都可以提供快速的XSLT幫助。節點使用XSLT重構

謝謝您的時間

Input.xml中

<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groupkey>1</groupkey> 
    <groupkey>2</groupkey> 
    <groupkey>2</groupkey> 


    <groupname>n1</groupname> 
    <groupname>n2</groupname> 
    <groupname>n3</groupname> 



</info> 
</root> 

慾望輸出

<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groups> 

     <group> 
      <groupkey>1</groupkey> 
      <groupname>n1</groupname> 
     </group> 

     <group> 
      <groupkey>2</groupkey> 
      <groupname>n2</groupname> 
     </group> 

     <group> 
      <groupkey>3</groupkey> 
      <groupname>n3</groupname> 
     </group> 



    </groups> 

</info> 
</root> 

添加以下

非常感謝Novatchev。我測試了它,正是我想要的。它的通用也。
最後一個問題請參考。如果我有另一個稱爲地址的節點,如下所示,我將如何合併它。請幫助。 謝謝你的時間。

輸入
<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groupkey>1</groupkey> 
    <groupkey>2</groupkey> 
    <groupkey>3</groupkey> 

    <groupname>n1</groupname> 
    <groupname>n2</groupname> 
    <groupname>n3</groupname> 



    <addresskey>1</addresskey> 
    <addresskey>2</addresskey> 
    <addresskey>3</addresskey> 

    <addressname>a1</addressname> 
    <addressname>a2</addressname> 
    <addressname>a3</addressname> 


</info> 
</root> 

輸出
<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groups> 

     <group> 
      <groupkey>1</groupkey> 
      <groupname>n1</groupname> 
     </group> 

     <group> 
      <groupkey>2</groupkey> 
      <groupname>n2</groupname> 
     </group> 

     <group> 
      <groupkey>3</groupkey> 
      <groupname>n3</groupname> 
     </group> 

    </groups> 


     <addresses> 

      <address> 
       <addresskey>1</addresskey> 
       <addressname>a1</addressname> 
      </address> 

      <address> 
       <addresskey>2</addresskey> 
       <addressname>a2</addressname> 
      </address> 

      <address> 
       <addresskey>3</addresskey> 
       <addressname>a3</addressname> 
      </address> 

    </addresses> 



</info> 
</root> 

回答

0

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="age"> 
    <xsl:call-template name="identity"/> 
    <groups> 
    <xsl:apply-templates select="following-sibling::groupkey" mode="grouping"/> 
    </groups> 
</xsl:template> 

<xsl:template match="groupkey" mode="grouping"> 
    <group> 
    <xsl:variable name="vPos" select="position()"/> 
    <xsl:call-template name="identity"/> 
    <xsl:apply-templates mode="grouping" select="../groupname[$vPos]"/> 
    </group> 
</xsl:template> 

<xsl:template match="groupname" mode="grouping"> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="groupkey|groupname"/> 
</xsl:stylesheet> 

當所提供的XML文檔施加(具有校正的第三groupkey):

<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groupkey>1</groupkey> 
    <groupkey>2</groupkey> 
    <groupkey>3</groupkey> 

    <groupname>n1</groupname> 
    <groupname>n2</groupname> 
    <groupname>n3</groupname> 

</info> 
</root> 

產生想要的,正確的結果

<root> 
    <info> 
     <name>papa</name> 
     <age>10</age> 
     <groups> 
     <group> 
      <groupkey>1</groupkey> 
      <groupname>n1</groupname> 
     </group> 
     <group> 
      <groupkey>2</groupkey> 
      <groupname>n2</groupname> 
     </group> 
     <group> 
      <groupkey>3</groupkey> 
      <groupname>n3</groupname> 
     </group> 
     </groups> 
    </info> 
</root> 

更新:通過增加需求

在此期間的OP更新的問題,一個第二類的數據(地址信息)存在於XML文檔中,並且必須進行類似的分組。

這裏是更新的解決方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="age"> 
    <xsl:call-template name="identity"/> 
    <groups> 
    <xsl:apply-templates select="following-sibling::groupkey" mode="grouping"/> 
    </groups> 
    <addresses> 
    <xsl:apply-templates select="following-sibling::addresskey" mode="grouping"/> 
    </addresses> 

</xsl:template> 

<xsl:template match="groupkey" mode="grouping"> 
    <group> 
    <xsl:variable name="vPos" select="position()"/> 
    <xsl:call-template name="identity"/> 
    <xsl:apply-templates mode="grouping" select="../groupname[$vPos]"/> 
    </group> 
</xsl:template> 

<xsl:template match="addresskey" mode="grouping"> 
    <address> 
    <xsl:variable name="vPos" select="position()"/> 
    <xsl:call-template name="identity"/> 
    <xsl:apply-templates mode="grouping" select="../addressname[$vPos]"/> 
    </address> 
</xsl:template> 

<xsl:template match="groupname|addressname" mode="grouping"> 
    <xsl:call-template name="identity"/> 
</xsl:template> 

<xsl:template match="groupkey|groupname|addresskey|addressname"/> 
</xsl:stylesheet> 

當這種轉變是在新指定的XML文檔應用:

<root> 
<info> 
    <name>papa</name> 
    <age>10</age> 

    <groupkey>1</groupkey> 
    <groupkey>2</groupkey> 
    <groupkey>3</groupkey> 

    <groupname>n1</groupname> 
    <groupname>n2</groupname> 
    <groupname>n3</groupname> 



    <addresskey>1</addresskey> 
    <addresskey>2</addresskey> 
    <addresskey>3</addresskey> 

    <addressname>a1</addressname> 
    <addressname>a2</addressname> 
    <addressname>a3</addressname> 


</info> 
</root> 

再次通緝,正確的結果產生:

<root> 
    <info> 
     <name>papa</name> 
     <age>10</age> 
     <groups> 
     <group> 
      <groupkey>1</groupkey> 
      <groupname>n1</groupname> 
     </group> 
     <group> 
      <groupkey>2</groupkey> 
      <groupname>n2</groupname> 
     </group> 
     <group> 
      <groupkey>3</groupkey> 
      <groupname>n3</groupname> 
     </group> 
     </groups> 
     <addresses> 
     <address> 
      <addresskey>1</addresskey> 
      <addressname>a1</addressname> 
     </address> 
     <address> 
      <addresskey>2</addresskey> 
      <addressname>a2</addressname> 
     </address> 
     <address> 
      <addresskey>3</addresskey> 
      <addressname>a3</addressname> 
     </address> 
     </addresses> 
    </info> 
</root> 
+0

非常感謝Novatchev。我測試了它,正是我想要的。最後一個問題是如何在現有的xslt地址中引入另一個屬性。我已更新above.pls幫助感謝您的時間 – poorcoder

+0

感謝第二部分也工作。 - pcoder – poorcoder