我有一个看起来像这样的XML文件
<sce xmlns:type="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node>
<type>LAYER_FEATURE_EXTRUDED_NODE</type>
<node_properties>
<node_property>
<name>MODEL_FILE_ATTRIBUTE_NAME</name>
<label>Palette attribute colorization</label>
<value>
<type:anyType xsi:type="xs:string">pop</type:anyType>
</value>
</node_property>
</node_properties>
</node>
</sce>
有几个节点都有很多node_properties。
我正在尝试将值MODEL_FILE_ATTRIBUTE_NAME
更改为COLOR_ATTRIBUTE_NAME
。
现在,我有以下代码选择属性(其他类型的某些节点可以具有属性MODEL_FILE_ATTRIBUTE_NAME
,我不想为其他类型更改它)
<xsl:template match= "*[type='LAYER_FEATURE_EXTRUDED_NODE']/node_properties/node_property[name='MODEL_FILE_ATTRIBUTE_NAME']">
</xsl:template>
我尝试了很多东西,但对于我的生活,我无法改变这个该死的价值。我在这里看到了很多问题,但找不到符合我要求的问题。
如果找到属性后如何更改属性值?
更新:我添加了所需的命名空间
答案 0 :(得分:1)
以这种方式尝试:
<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= "*[type='LAYER_FEATURE_EXTRUDED_NODE']/node_properties/node_property/name[.='MODEL_FILE_ATTRIBUTE_NAME']">
<xsl:copy>
<xsl:text>COLOR_ATTRIBUTE_NAME</xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
应用于更正的输入,结果为:
<?xml version="1.0" encoding="UTF-8"?>
<sce xmlns:type="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node>
<type>LAYER_FEATURE_EXTRUDED_NODE</type>
<node_properties>
<node_property>
<name>COLOR_ATTRIBUTE_NAME</name>
<label>Palette attribute colorization</label>
<value>
<type:anyType xsi:type="xs:string">pop</type:anyType>
</value>
</node_property>
</node_properties>
</node>
</sce>
答案 1 :(得分:1)
您的输入不是格式良好的XML文档。没有XSLT处理器会接受它,因为两个名称空间前缀没有绑定。
警告:您的标题建议您尝试更改属性值,但是您想要更改的内容:
<name>MODEL_FILE_ATTRIBUTE_NAME</name>
不是属性。这是一个包含文本内容的元素。因此,您应该寻求一种方法来更改元素节点的文本内容。
XML输入
如您所见,我已修改输入以包含xsi:
和type:
的名称空间声明。
<node xmlns:type="www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<type>LAYER_FEATURE_EXTRUDED_NODE</type>
<node_properties>
<node_property>
<name>MODEL_FILE_ATTRIBUTE_NAME</name>
<label>Palette attribute colorization</label>
<value>
<type:anyType xsi:type="xs:string">pop</type:anyType>
</value>
</node_property>
</node_properties>
</node>
<强>样式表强>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[type='LAYER_FEATURE_EXTRUDED_NODE']/node_properties/node_property[name='MODEL_FILE_ATTRIBUTE_NAME']/name/text()">
<xsl:text>COLOR_ATTRIBUTE_NAME</xsl:text>
</xsl:template>
</xsl:stylesheet>
XML输出
<?xml version="1.0" encoding="UTF-8"?>
<node xmlns:type="www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<type>LAYER_FEATURE_EXTRUDED_NODE</type>
<node_properties>
<node_property>
<name>COLOR_ATTRIBUTE_NAME</name>
<label>Palette attribute colorization</label>
<value>
<type:anyType xsi:type="xs:string">pop</type:anyType>
</value>
</node_property>
</node_properties>
</node>
编辑:您已编辑了问题并扩展了输入示例。谢谢!由于sce
元素未正确关闭,因此文档仍然格式不正确。
上面的样式表适用于任何输入,在此新文档作为输入的情况下,输出将为:
<?xml version="1.0" encoding="UTF-8"?>
<sce xmlns:type="http://schemas.microsoft.com/2003/10/Serialization/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<node>
<type>LAYER_FEATURE_EXTRUDED_NODE</type>
<node_properties>
<node_property>
<name>COLOR_ATTRIBUTE_NAME</name>
<label>Palette attribute colorization</label>
<value>
<type:anyType xsi:type="xs:string">pop</type:anyType>
</value>
</node_property>
</node_properties>
</node>
</sce>