Xslt不同的值并动态地向现有xml添加元素

时间:2018-05-17 09:47:53

标签: xml xslt xslt-1.0

我需要使用xslt更改现有xml的格式。我能够获得所有不同的ID,但是有问题将价格和国家元素设置为不同的ID并且遇到问题。需要转换下面的xml

<result>
    <data>
        <ID>7705379</ID>
        <value>54</value>
        <country>lv</country>
        <price>24.99</price>
    </data>
    <data>
        <ID>7705379</ID>
        <value>54</value>
        <country>fi</country>
        <price>24.99</price>
    </data>
        <data>
        <ID>7111111</ID>
        <value>503</value>
        <country>fi</country>
        <price>19.99</price>
    </data>
        <data>
        <ID>7111111</ID>
        <value>503</value>
        <country>se</country>
        <price>119.99</price>
    </data>
</result>

看起来像这样。

 <data>
        <Product>
            <Fields>
                <ID>7705379</ID>
                <ProductST>
                    <Key id="SE" >
                        <Value>54</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="lv" >
                        <Value>24.99</Value>
                    </Key>
                    <Key id="fi" >
                        <Value>24.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
        <Product>
            <Fields>
                <ID>7111111</ID>
                <ProductST>
                    <Key id="SE" >
                        <Value>503</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="fi" >
                        <Value>19.99</Value>
                    </Key>
                    <Key id="se" >
                        <Value>119.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
    </data>

1 个答案:

答案 0 :(得分:0)

根据输入的XML共享,共享输出XML存在一些差异。很难在评论中列出它们,因此将它们包括在解决方案中。

  1. 输入XML中与<country>元素对应的值与输出的少量<Key id="">元素不匹配。
  2. <ProductST>在输出中有一个<Key>子元素,其属性id的值SE在输入XML中不存在。
  3. <ProductPrice>具有正确数量的子<Key>元素,其id属性值与4个实例中的3个中的输入<country>的值匹配。
  4. 假设输入XML和输出XML中使用的数据不匹配,您可以尝试下面的XSLT解决方案,该解决方案应该给出足够的关于对值进行分组的想法。此解决方案基于输入XML,因此不会与共享输出XML匹配。

    <xsl:key name="kId" match="data" use="ID" />
    <xsl:template match="result">
        <data>
            <xsl:for-each select="data[generate-id() = generate-id(key('kId', ID)[1])]">
                <Product>
                    <Fields>
                        <ID><xsl:value-of select="key('kId', ID)/ID" /></ID>
                        <ProductST>
                            <Key>
                                <xsl:attribute name="id">
                                    <xsl:value-of select="'SE'" />
                                </xsl:attribute>
                                <Value><xsl:value-of select="key('kId', ID)/value" /></Value>
                            </Key>
                        </ProductST>
                        <ProductPrice>
                            <xsl:for-each select="key('kId', ID)">
                                <Key>
                                    <xsl:attribute name="id">
                                        <xsl:value-of select="country" />
                                    </xsl:attribute>
                                    <Value><xsl:value-of select="price" /></Value>
                                </Key>
                            </xsl:for-each>
                        </ProductPrice>
                    </Fields>
                </Product>
            </xsl:for-each>
        </data>
    </xsl:template>
    

    这会生成以下输出

    <data>
        <Product>
            <Fields>
                <ID>7705379</ID>
                <ProductST>
                    <Key id="SE">
                        <Value>54</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="lv">
                        <Value>24.99</Value>
                    </Key>
                    <Key id="fi">
                        <Value>24.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
        <Product>
            <Fields>
                <ID>7111111</ID>
                <ProductST>
                    <Key id="SE">
                        <Value>503</Value>
                    </Key>
                </ProductST>
                <ProductPrice>
                    <Key id="fi">
                        <Value>19.99</Value>
                    </Key>
                    <Key id="se">
                        <Value>119.99</Value>
                    </Key>
                </ProductPrice>
            </Fields>
        </Product>
    </data>
    

    编辑:根据评论更新了解决方案。