我需要使用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>
答案 0 :(得分:0)
根据输入的XML共享,共享输出XML存在一些差异。很难在评论中列出它们,因此将它们包括在解决方案中。
<country>
元素对应的值与输出的少量<Key id="">
元素不匹配。<ProductST>
在输出中有一个<Key>
子元素,其属性id
的值SE
在输入XML中不存在。<ProductPrice>
具有正确数量的子<Key>
元素,其id
属性值与4个实例中的3个中的输入<country>
的值匹配。假设输入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>
编辑:根据评论更新了解决方案。