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

时间:2017-06-07 15:25:44

标签: xml xslt xslt-1.0

我需要使用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标记,并且第一个选择条件值也应用于下面的项目。请帮我纠正代码。

1 个答案:

答案 0 :(得分:0)

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

我怀疑你在这里有另一个问题。 XSLT变量存储值,而不是表达式。在您的示例中,ID变量存储1001(第一个item的ID)的值,并且它将被复制到所有item s - 正如您的输出所示。如果您希望实际输出由每个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>