更改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表中的值会影响其他字段