[英]Multiple elements with same name in XML and want to change value of one specific element only based on one condition using xslt
[英]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.