我正在寻找一种更简单,更优雅的方式来替换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;来完成,所以我可以只替换文本而不是整个元素,但我无法弄清楚其余的。
提前致谢。
答案 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>