更改XML属性的值会删除其他属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改XML属性的值会删除其他属性相关的知识,希望对你有一定的参考价值。

我基于StackOverflow修改XML属性值的各种问题创建了一个简单的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>
<xsl:template match="@Name[.='Source']">
    <xsl:attribute name="Id">MROClass</xsl:attribute>
</xsl:template>

我将它应用于以下XML:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="dirD33FABDFBCD72FAC87416BC87B4323D1" Name="Source" />
        </DirectoryRef>
    </Fragment>
</Wix>

问题是修改了Id属性,但删除了Name属性。如何修改单个属性而不删除其他属性?我尝试过使用复制和其他方法,但结果总是一样的。

样本输出:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="TARGETDIR">
            <Directory Id="MROClass" />
        </DirectoryRef>
    </Fragment>
</Wix>
答案

删除了Name属性,因为这就是您所匹配的内容。

如果要更新Id属性,但是基于Name属性,请尝试更改:

match="@Name[.='Source']"

至:

match="*[@Name='Source']/@Id"
另一答案

只需通过添加以下内容,在匹配模板的当前上下文中复制原始值。现在,您只使用新的Id属性完全重写Name属性。

<xsl:copy-of select="."/>

富勒版:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@Name[.='Source']">
    <xsl:attribute name="Id">MROClass</xsl:attribute>
    <xsl:copy-of select="."/>
  </xsl:template>

</xsl:stylesheet>

以上是关于更改XML属性的值会删除其他属性的主要内容,如果未能解决你的问题,请参考以下文章

[DataGridCheckBoxColumn在属性更改时不会在MVVM中更新

如何使用PowerShell更改XML Element属性的值?

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

用[(NgModel)]更改绑定的Angular表中的值会影响其他字段

每当我尝试从 Fragment java 文件中更改片段的某些属性时,应用程序就会崩溃

为动态创建的 Android 片段提供自定义属性值