简单的XSLT文本替换



我正在寻找一种更简单、更优雅的方法来替换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>

我想这可以用<xsl:template-match="B/Target/text()">,所以我可以只替换文本,而不是整个元素,但我无法理解其余部分。

提前谢谢。

此样式表:

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

这就是你所要做的:

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

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

<?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>

相关内容

  • 没有找到相关文章

最新更新