繁体   English   中英

使用xslt根据条件更改xml字段的值

[英]Change value of a xml field based on condition using xslt

我需要使用xslt根据某些条件更改xml中的字段值。

我的输入xml:

<?xml version="1.0" encoding="UTF-8"?>
<rows>
    <item>
        <Name>ABC</Name>
        <ID>1234</ID>
    </item>
    <item>
        <Name>XYX</Name>
        <ID>234</ID>
    </item>
    <item>
        <Name>PXC</Name>
        <ID>456</ID>
    </item> 
</rows>

我的XSL代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:variable name="ID" select="/rows/item/ID"/>
    <xsl:template match="/rows/item/ID">
        <xsl:choose>
            <xsl:when test="$ID = '1234'">1001</xsl:when>
            <xsl:when test="$ID = '234'">1002</xsl:when>
            <xsl:when test="$ID = '456'">1003</xsl:when>
            <xsl:when test="$ID = '789'">1004</xsl:when>
            <xsl:when test="$ID = '1903'">1005</xsl:when>
            <xsl:otherwise>
                <xsl:message terminate="no">SEVERE: No ID Mapping is found <xsl:value-of select="$ID"/>
                </xsl:message>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

输出xml:

<rows>
    <item>
        <Name>ABC</Name>
        1001
    </item>
    <item>
        <Name>XYX</Name>
        1001
    </item>
    <item>
        <Name>PXC</Name>
        1001
    </item> 
</rows>

我期望ID字段的值根据我选择的条件而改变。 如果选择条件中未保留的值到来,则应抛出错误。

但是输出的xml缺少ID字段的xml标记,并且第一个选择条件值也应用于以下项目。 请帮助我更正代码。

要添加缺少的标签,请将模板的内容放在xsl:copy指令内。 或更改模板以仅匹配ID的文本节点。

我怀疑您在这里还有另一个问题。 XSLT变量存储值,而不是表达式。 在您的示例中, ID变量存储值1001 (第一item的ID),并且将其复制到所有item -就像您的输出所示。 如果要由每个ID单个值确定实际输出,则不能使用全局变量。

请尝试以下方法:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="ID">
    <xsl:copy>
        <xsl:choose>
            <xsl:when test=". = '1234'">1001</xsl:when>
            <xsl:when test=". = '234'">1002</xsl:when>
            <xsl:when test=". = '456'">1003</xsl:when>
            <xsl:when test=". = '789'">1004</xsl:when>
            <xsl:when test=". = '1903'">1005</xsl:when>
            <xsl:otherwise>
                <xsl:message terminate="no">SEVERE: No ID Mapping is found <xsl:value-of select="."/></xsl:message>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM