如何使用xslt更新xml节点值?

时间:2015-05-25 02:03:48

标签: xml xslt xpath

我有一个以下格式的xml文件

         <input>
            <node1>No Update<node1>
            <node2>No Update<node2>
            <node3>No Update<node3>
            <node4>Data<node4>
         <input>

我的要求是更新那些包含数据“无更新”的节点的值。进入空字符串,以便所需的输出

         <input>
            <node1><node1>
            <node2><node2>
            <node3><node3>
            <node4>Data<node4>
         <input> 

如何使用xslt实现它,有人可以帮忙。

2 个答案:

答案 0 :(得分:1)

使用此XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

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

  <xsl:template match="*[text() = 'No Update']/text()"/>

</xsl:stylesheet>

如果您不想在输出中使用自封闭标记,请将模板更改为:

<xsl:template match="*[text() = 'No Update']/text()">
  <xsl:value-of select="''"/>
</xsl:template>

答案 1 :(得分:0)

只需使用此简短(呃)转换 - 覆盖身份规则的相同想法,但匹配必要的文本节点 - 而不是元素节点。 :

<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="text()[. = 'No Update']"/>
</xsl:stylesheet>

对提供的XML应用此转换(更正为格式良好的XML文档):

<input>
    <node1>No Update</node1>
    <node2>No Update</node2>
    <node3>No Update</node3>
    <node4>Data</node4>
</input>

产生了想要的正确结果

<input>
   <node1/>
   <node2/>
   <node3/>
   <node4>Data</node4>
</input>