xml - 简单的 XSLT 文本替换

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

我想这可以用 来完成,所以我可以只替换文本而不是整个元素,但我想不出其余的.

提前致谢。

最佳答案

这个样式表:

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

关于xml - 简单的 XSLT 文本替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9572422/

相关文章:

android - 如何在 ScrollView 中添加所有 View ?

java - xalan 验证 java.lang.NoSuchMethodException : For extension function

php - 在现有网页中显示带有 XSL 的 XML 文件

java - Java 6 中对 xinclude 的默认支持?

python - 如何使用 python 将 xml 文件转换为 JSON?

c# - 如何将异常对象序列化为 xml 字符串

java - XML 转换和换行字符

xml - 使用 XSLT 1.0 将 XHTML 转换为结构化 XML

xml - 使用 xslt 解析然后格式化名称

xslt - 如何使用 xslt 将 json 转换为 xml