我有这个XML文档:
<Document>
<a>
<b>
<c1>CCC111</c1>
<c2>CCCC222</c2>
</b>
<d>
<d1>DDD111</d1>
<d2>DDD222</d2>
<d3>DDD333</d3>
</d>
</a>
</Document>
我想用XXXXXX替换Document / a / d / d1的值:
<Document>
<a>
<b>
<c1>CCC111</c1>
<c2>CCCC222</c2>
</b>
<d>
<d1>XXXXXX</d1>
<d2>DDD222</d2>
<d3>DDD333</d3>
</d>
</a>
</Document>
我有这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Document/a/d/d1/text()">
XXXXXX
</xsl:template>
</xsl:stylesheet>
但我获得了相同的输入和输出:/
谢谢。
答案 0 :(得分:2)
在我的输入文件中,我有:
<Document xmlns="tatatta" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="totoot">
这意味着文档中的元素位于tatatta
命名空间中,因为XPath 1.0中没有前缀的名称总是引用模板不匹配的非命名空间元素。您需要将命名空间映射到前缀并在模式中使用它,例如:
<xsl:template match="t:Document/t:a/t:d/t:d1/text()"
xmlns:t="tatatta">
<xsl:text>XXXXXX</xsl:text>
</xsl:template>
(或者您可以将xmlns:t
放在xsl:stylesheet
而不是模板上,如果您需要在其他地方使用相同的命名空间。)
答案 1 :(得分:1)
我猜想在某个地方有一个简单的转录错误。虽然您可以稍微简化XXXXXX
覆盖模板:
<xsl:template match="d1/text()">XXXXXX</xsl:template>
您发布的内容按原样运行,并说明您的概念是正确的。我可以确认您发布的内容适用于XSLT 2.0(Saxon HE)和XSLT 1.0(Saxon 6.5.5)处理器。
发现命名空间定义后更新:
好的,因此输入XML文档的元素位于命名空间中。没问题,只需为tatatta
命名空间声明一个名称空间前缀,并调整template/@match
来计算命名空间,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:t="tatatta">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="t:d1/text()">XXXXXX</xsl:template>
</xsl:stylesheet>
答案 2 :(得分:0)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Document/a/d/d1/text()[.='DDD111']">XXXXXX </xsl:template>
</xsl:stylesheet>