根据属性的值修改元素的值

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 属性替换所有元素的值。