使用XSLT更改元素节点的文本内容

时间:2014-12-19 15:05:45

标签: xml xslt

我有一个看起来像这样的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>

我尝试了很多东西,但对于我的生活,我无法改变这个该死的价值。我在这里看到了很多问题,但找不到符合我要求的问题。

如果找到属性后如何更改属性值?

更新:我添加了所需的命名空间

2 个答案:

答案 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>