使用带有条件的 XSLT 将 XML 转换为 XML
Posted
技术标签:
【中文标题】使用带有条件的 XSLT 将 XML 转换为 XML【英文标题】:Transform XML to XML with XSLT with conditions 【发布时间】:2019-01-23 04:00:35 【问题描述】:我需要使用 XSLT 将一些 xml 转换为另一个。
输入看起来像这样:
<RootNode>
<Products>
<Price>10.02</Price>
<TaxRate>1.23</TaxRate>
<CurrencyId>USD</CurrencyId>
</Products>
</RootNode>
和输出:
<RootNode>
<Products>
<Product>
<Prices>
<Price>10.02</Price>
<TaxRate type="0">16</TaxRate>
<Currency>USD</Currency>
</Prices>
</Product>
</Products>
</RootNode>
现在我正在尝试这样的事情,但这不起作用:
<xsl:template match="/">
<RootElement>
<xsl:for-each select="Supplier-Catalog/Products">
<xsl:attribute-set name="Price" use-attribute-sets="Prices">
<xsl:value-of select="Price" />
</xsl:attribute-set>
</xsl:for-each>
</RootElement>
</xsl:template>
</xsl:stylesheet>
TaxRate type="0" - 取决于输入的 TaxRate 值。
有人可以帮我解决这个问题吗?
编辑
好的,我创建了这样的东西:
<xsl:template match="/">
<RootElement>
<xsl:for-each select="Supplier-Catalog/Products">
<Prices>
<Price>
<xsl:value-of select="Price" />
</Price>
<TaxRate>
<xsl:value-of select="TaxRate" />
</TaxRate>
<Currency>
<xsl:value-of select="CurrencyId" />
</Currency>
</Prices>
</xsl:for-each>
</RootElement>
</xsl:template>
这没问题,但仍然不知道如何将“type=0”添加到 TaxRate 属性
编辑 2
还有一个问题...
对于这个结构
Products>
<Stock>
<Quantity>5</Quantity>
</Stock>
<Stock>
<Quantity>50</Quantity>
</Stock>
</Products><Products>
<Stock>
<Quantity>1</Quantity>
</Stock>
<Stock>
<Quantity>2</Quantity>
</Stock>
</Products>
还有这个 XSLT
<xsl:for-each select="Products">
<Product>
<Stock>
<Quantity>
<xsl:value-of select="sum(//Products/Stock/Quantity)" />
</Quantity>
</Stock>
</Product>
</xsl:for-each>
</Products>
我明白了:
<Products>
<Product>
<Stock>
<Quantity>58</Quantity>
</Stock>
</Product>
<Product>
<Stock>
<Quantity>58</Quantity>
</Stock>
</Product>
这是错误的,因为它将所有值相加,而不是:
<Products>
<Product>
<Stock>
<Quantity>55</Quantity>
</Stock>
</Product>
<Product>
<Stock>
<Quantity>3</Quantity>
</Stock>
</Product>
我在哪里弄错了?
【问题讨论】:
你能解释一下 TaxRate 类型的逻辑吗?如果它不总是 0,那么决定它的值的规则是什么?谢谢 你可以用例如写属性<TaxRate type="0"><xsl:value-of select="TaxRate"/></TaxRate>
,但正如蒂姆所说,根据您计算值的逻辑,您可能需要以不同的方式进行操作..
1.23 =0 和值 16, 0.7 = 1 和值 3
TaxRate 会只包含“1.23”或“0.7”,还是可以包含其他值?
1.23、0.7 和 0。只有这三个值是可能的
【参考方案1】:
在创建属性和分配值时,您需要使用选择/何时条件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
<RootElement>
<xsl:for-each select="RootNode/Products">
<Prices>
<Price>
<xsl:value-of select="Price" />
</Price>
<TaxRate>
<xsl:choose>
<xsl:when test="TaxRate=1.23">
<xsl:attribute name="type"><xsl:value-of select="0"/></xsl:attribute>
<xsl:value-of select="'16'"/>
</xsl:when>
<xsl:when test="TaxRate=0.7">
<xsl:attribute name="type"><xsl:value-of select="1"/></xsl:attribute>
<xsl:value-of select="'3'"/>
</xsl:when>
<xsl:when test="TaxRate=0">
<xsl:attribute name="type"><xsl:value-of select="0"/></xsl:attribute>
<xsl:value-of select="'0'"/>
</xsl:when>
</xsl:choose>
</TaxRate>
<Currency>
<xsl:value-of select="CurrencyId" />
</Currency>
</Prices>
</xsl:for-each>
</RootElement>
</xsl:template>
</xsl:stylesheet>
【讨论】:
查看此链接以获取参考:xsltfiddle.liberty-development.net/3NzcBth/26 感谢大家的帮助:)以上是关于使用带有条件的 XSLT 将 XML 转换为 XML的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 将 XML 转换为带有嵌套 AND/OR 的“布尔”英文句子
如何停止 xslt3.0 的 xml-to-json() 函数将数字转换为指数表示法
Adobe LiveCycle:使用 XSLT 将 XML 转换为 XML
XSLT 3.0 - 在 XSLT 3.0 xml-to-json() 中出现错误“重复键值”