根据属性的值修改元素的值
Modify the value of an element depending on the value of attribute
有没有一种方法可以根据元素的属性值更新元素的值?
我在下面使用 xslt,但它替换了属性的值而不是元素的值。
输入XML:
<Elements>
<Element>
<Entry1>
<data attribute="Delete">value</data>
</Entry1>
<Entry2 attribute="Delete"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="Delete">value</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="Delete">value</data>
</Entry1>
</Element>
</Elements>
XSLT:
<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="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@attribute">
<xsl:attribute name="attribute">
<xsl:choose>
<xsl:when test=". = 'Delete'">REMOVED</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
XSLT 生成的输出:
<Elements>
<Element>
<Entry1>
<data attribute="REMOVED">value</data>
</Entry1>
<Entry2 attribute="REMOVED"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="REMOVED">value</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="REMOVED">value</data>
</Entry1>
</Element>
</Elements>
期望输出:
<Elements>
<Element>
<Entry1>
<data attribute="Delete">REMOVED</data>
</Entry1>
<Entry2 attribute="Delete"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="Delete">REMOVED</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="Delete">REMOVED</data>
</Entry1>
</Element>
</Elements>
将您的主模板更改为
<xsl:template match="*[@attribute='Delete' and normalize-space(.)]">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:text>REMOVED</xsl:text>
</xsl:copy>
</xsl:template>
这将用具有值“已删除”且元素值不为空的 attribute
属性替换所有元素的值。
有没有一种方法可以根据元素的属性值更新元素的值?
我在下面使用 xslt,但它替换了属性的值而不是元素的值。
输入XML:
<Elements>
<Element>
<Entry1>
<data attribute="Delete">value</data>
</Entry1>
<Entry2 attribute="Delete"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="Delete">value</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="Delete">value</data>
</Entry1>
</Element>
</Elements>
XSLT:
<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="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@attribute">
<xsl:attribute name="attribute">
<xsl:choose>
<xsl:when test=". = 'Delete'">REMOVED</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
XSLT 生成的输出:
<Elements>
<Element>
<Entry1>
<data attribute="REMOVED">value</data>
</Entry1>
<Entry2 attribute="REMOVED"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="REMOVED">value</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="REMOVED">value</data>
</Entry1>
</Element>
</Elements>
期望输出:
<Elements>
<Element>
<Entry1>
<data attribute="Delete">REMOVED</data>
</Entry1>
<Entry2 attribute="Delete"/>
<Entry3>
<data attribute="Update">value</data>
</Entry3>
</Element>
<Element attribute="Update">
<Entry1>
<data2>
<data3 attribute="Delete">REMOVED</data3>
</data2>
</Entry1>
</Element>
<Element attribute="Update">
<Entry1>
<data attribute="Delete">REMOVED</data>
</Entry1>
</Element>
</Elements>
将您的主模板更改为
<xsl:template match="*[@attribute='Delete' and normalize-space(.)]">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:text>REMOVED</xsl:text>
</xsl:copy>
</xsl:template>
这将用具有值“已删除”且元素值不为空的 attribute
属性替换所有元素的值。