简单的XSLT文本替换

时间:2012-03-05 19:08:07

标签: xml xslt xslt-1.0

我正在寻找一种更简单,更优雅的方式来替换XML中的文本。对于源XML,如:

<A>
 <B>
  <Name>ThisOne</Name>
  <Target>abc</Target>
 </B>
 <B>
  <Name>NotThisOne</Name>
  <Target>abc</Target>
 </B>
 <B>
  <Name>ThisOne</Name>
  <Target>def</Target>
 </B>
</A>

我想将名称为“ThisOne”的所有Target元素的文本更改为“xyz”。

结果将是:

<A>
 <B>
  <Name>ThisOne</Name>
  <Target>xyz</Target>     <--   Changed.
 </B>
 <B>
  <Name>NotThisOne</Name>
  <Target>abc</Target>
 </B>
 <B>
  <Name>ThisOne</Name>
  <Target>xyz</Target>     <--   Changed.
 </B>
</A>

我完成了这个:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="B/Target">
    <xsl:choose>
      <xsl:when test="../Name/text()='ThisOne'"><Target>xyz</Target></xsl:when>
      <xsl:otherwise><Target><xsl:value-of select="text()"/></Target></xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

我在想这可以用&lt; xsl:template match =“B / Target / text()”&gt;来完成,所以我可以只替换文本而不是整个元素,但我无法弄清楚其余的。

提前致谢。

3 个答案:

答案 0 :(得分:5)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

  <xsl:template match="B[Name='ThisOne']/Target/text()">
    <xsl:text>xyz</xsl:text>
  </xsl:template>

</xsl:stylesheet>

使用您的XML输入产生:

<A>
  <B>
    <Name>ThisOne</Name>
    <Target>xyz</Target>
  </B>
  <B>
    <Name>NotThisOne</Name>
    <Target>abc</Target>
  </B>
  <B>
    <Name>ThisOne</Name>
    <Target>xyz</Target>
  </B>
</A>

答案 1 :(得分:1)

这就是你要做的全部:

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

 <xsl:template match="B/Target[../Name='ThisOne']">
  <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:text>xyz</xsl:text>
  </xsl:copy>
 </xsl:template>

第一个模板是“身份转换”,并将输入复制到输出不变。第二个匹配您要更改的特定目标,复制标记和属性,并替换所需的文本。

答案 2 :(得分:1)

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:cds="cds_dt" exclude-result-prefixes="cds">
    <!-- Identity transfrom - just copy what doesn't need changing -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- a rule for what does need changing -->
    <!-- Change all Target nodes whose parent has a child of Name equal to ThisOne -->
    <xsl:template match="/A/B[Name='ThisOne']/Target">
        <Target>xyz</Target>
    </xsl:template>
</xsl:stylesheet>