Слияние узлов XML - PullRequest
       1

Слияние узлов XML

2 голосов
/ 17 апреля 2011

Может ли кто-нибудь дать мне пример объединения следующих узлов XML с XSLT?

<code><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>
    <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>

Полученный XML должен будет сгруппировать различные узлы адреса в один родительский узелузел для поставщика.

Можете ли вы также сказать мне, какой инструмент XSLT / XML вы используете для этой работы.

Ответы [ 2 ]

4 голосов
/ 17 апреля 2011

Следующие группы стилей по VendorID. Обратите внимание, что вы не говорите, какие элементы являются частью адреса, а какие нет. В этой таблице стилей предполагается, что только VendorID и VendorName не являются частью адреса. Отредактируйте соответственно.

<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>

Применительно к этому входу:

<code><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>
    
        <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>
    

Выдает:

<code><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>
    
0 голосов
/ 18 апреля 2011

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...