使用带有条件的 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,那么决定它的值的规则是什么?谢谢 你可以用例如写属性&lt;TaxRate type="0"&gt;&lt;xsl:value-of select="TaxRate"/&gt;&lt;/TaxRate&gt;,但正如蒂姆所说,根据您计算值的逻辑,您可能需要以不同的方式进行操作.. 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() 中出现错误“重复键值”

XSLT 将嵌套的 xml 元素写为一个带有逗号分隔值字符串的元素

使用带有附加信息的 xslt 转换 xml