2011-04-17 98 views
2

任何人都可以給我一個合併下列XML節點和XSLT的例子嗎?合併XML節點

<pre> 
    <Table1> 
     <VendorID>123456</VendorID> 
     <VendorName>StackOverflow Inc</VendorName> 
     <Type>ADDRESS</Type> 
     <TypeName>Mailing</TypeName> 
     <DescriptionType>Main Mailing</DescriptionType> 
     <Description>P O Box 01 Manama Bahrain</Description> 
     <Online>0</Online> 
     <CommodityTypeDesc/> 
    </Table1> 
</pre> 

<pre> 
    <Table1> 
     <VendorID>123456</VendorID> 
     <VendorName>StackOverflow Inc</VendorName> 
     <Type>ADDRESS</Type> 
     <TypeName>Remittance</TypeName> 
     <DescriptionType>Main Remittance</DescriptionType> 
     <Description>P O Box 02 Manama Bahrain</Description> 
     <Online>0</Online> 
     <CommodityTypeDesc/> 
    </Table1> 
</pre> 

生成的XML需要將不同的地址節點組合到供應商的一個父節點中。

您還可以告訴我您用於此項工作的XSLT/XML工具。

+0

謝謝#rekaszeru格式編輯 – Klaptrap 2011-04-17 05:59:59

回答

4

以下由VendorID組成的樣式表組。請注意,您不會說哪些元素是地址的一部分,哪些不是。該樣式表假定只有VendorIDVendorName不是地址的一部分。相應編輯。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="byVendor" match="root/pre" use="Table1/VendorID" /> 
    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="root/pre" /> 
    <xsl:template 
     match="root/pre[generate-id() = 
         generate-id(key('byVendor', Table1/VendorID))]"> 
     <xsl:call-template name="identity"/> 
    </xsl:template> 
    <xsl:template match="Table1"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|VendorID|VendorName" /> 
      <Addresses> 
       <xsl:apply-templates select="key('byVendor', VendorID)/Table1" 
             mode="address" /> 
      </Addresses> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Table1" mode="address"> 
     <Address> 
      <xsl:apply-templates 
       select="*[not(self::VendorID or self::VendorName)]" /> 
     </Address> 
    </xsl:template> 
</xsl:stylesheet> 

當應用於此輸入:

<root> 
    <pre> 
     <Table1> 
      <VendorID>123456</VendorID> 
      <VendorName>StackOverflow Inc</VendorName> 
      <Type>ADDRESS</Type> 
      <TypeName>Mailing</TypeName> 
      <DescriptionType>Main Mailing</DescriptionType> 
      <Description>P O Box 01 Manama Bahrain</Description> 
      <Online>0</Online> 
      <CommodityTypeDesc /> 
     </Table1> 
    </pre> 
    <pre> 
     <Table1> 
      <VendorID>123456</VendorID> 
      <VendorName>StackOverflow Inc</VendorName> 
      <Type>ADDRESS</Type> 
      <TypeName>Remittance</TypeName> 
      <DescriptionType>Main Remittance</DescriptionType> 
      <Description>P O Box 02 Manama Bahrain</Description> 
      <Online>0</Online> 
      <CommodityTypeDesc /> 
     </Table1> 
    </pre> 
</root> 

產地:

<root> 
    <pre> 
     <Table1> 
      <VendorID>123456</VendorID> 
      <VendorName>StackOverflow Inc</VendorName> 
      <Addresses> 
       <Address> 
        <Type>ADDRESS</Type> 
        <TypeName>Mailing</TypeName> 
        <DescriptionType>Main Mailing</DescriptionType> 
        <Description>P O Box 01 Manama Bahrain</Description> 
        <Online>0</Online> 
        <CommodityTypeDesc /> 
       </Address> 
       <Address> 
        <Type>ADDRESS</Type> 
        <TypeName>Remittance</TypeName> 
        <DescriptionType>Main Remittance</DescriptionType> 
        <Description>P O Box 02 Manama Bahrain</Description> 
        <Online>0</Online> 
        <CommodityTypeDesc /> 
       </Address> 
      </Addresses> 
     </Table1> 
    </pre> 
</root> 
+0

+1我希望我可以認爲清楚!非常好! – rekaszeru 2011-04-17 06:18:52

+0

令人印象深刻的工作 - 謝謝。節點是地址的一部分的假設是正確的 - 謝謝。 – Klaptrap 2011-04-17 06:55:37

+0

在我的實現中,我得到了正確的模式,但是重複了,例如Table1節點及其子節點兩次。有任何想法嗎? – Klaptrap 2011-04-17 12:40:29

0

XML實際上,如下,因此爲什麼我收到重複:

<Vendors> 
    <Table1> 
     <VendorID>123456</VendorID> 
     <VendorName>StackOverflow Inc</VendorName> 
     <Type>ADDRESS</Type> 
     <TypeName>Mailing</TypeName> 
     <DescriptionType>Main Mailing</DescriptionType> 
     <Description>P O Box 01 Manama Bahrain</Description> 
     <Online>0</Online> 
     <CommodityTypeDesc /> 
    </Table1> 
    <Table1> 
     <VendorID>123456</VendorID> 
     <VendorName>StackOverflow Inc</VendorName> 
     <Type>ADDRESS</Type> 
     <TypeName>Remittance</TypeName> 
     <DescriptionType>Main Remittance</DescriptionType> 
     <Description>P O Box 02 Manama Bahrain</Description> 
     <Online>0</Online> 
     <CommodityTypeDesc /> 
    </Table1> 
</Vendors> 
+0

你還在尋找答案? – 2011-06-15 21:48:28