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