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