我有一个简单的XML文档,我试图根据元素的值替换元素。
<document>
<meta>
<wk_abc>
UCM:SOURCE1
</wk_abc>
<wk_def>
Other Text
</wk_def>
<wk_abc>
UCM:SOURCE2
</wk_abc>
</meta>
<content>
Lorem ipsum
</content>
</document>
我的XSL是这样的:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="wk_abc">
<xsl:if test=".='UCM:SOURCE1'">
<bob>bob</bob>
</xsl:if>
</xsl:template>
但它一直在失败IF条件。并跳过替换元素。为什么这个测试失败了?
答案 0 :(得分:2)
这是因为节点中“UCM:SOURCE1”的两侧都有空格。
尝试将xsl:if
条件更改为此选项以在执行检查之前删除空格:
<xsl:if test="normalize-space()='UCM:SOURCE1'">
请注意,这不仅仅是修剪空白区域。例如,如果文本为UCM:SOURCE1 UCMSOURCE2
,则中间的whitepsaces将合并为一个单独的空格,因此normalize-space将返回UCM:SOURCE1 UCMSOURCE2
答案 1 :(得分:0)
您可以使用 contains(),例如:
<xsl:if test="contains(., 'UCM:SOURCE1')">
答案 2 :(得分:0)
它看起来像一个空白问题。如果我将输入文件更改为
<document>
<meta>
<wk_abc>UCM:SOURCE1</wk_abc>
<wk_def>
Other Text
</wk_def>
<wk_abc>
UCM:SOURCE2
</wk_abc>
</meta>
<content>
Lorem ipsum
</content>
</document>
如果输入文档有空格,则保留它们。如果你想进一步控制空间处理使用,xsl-strip构造。 请查看下面有关如何精细控制空白处理的文章: http://www.ibm.com/developerworks/library/x-tipwhitesp/
stackoverflow中有一些关于如何使用这些结构的早期建议: Whitespace node in XSLT
您也可以按照以下建议尝试规范化空间: How to Trim in xslt?
来自XSLT规范(http://www.w3.org/TR/xslt#strip):
在构造了源文档或样式表文档的树之后,但在XSLT以其他方式处理之前,一些文本节点被剥离。除非文本节点仅包含空格字符,否则永远不会剥离文本节点。剥离文本节点会从树中删除文本节点。剥离过程将一组必须保留空白的元素名称作为输入。剥离过程适用于样式表和源文档,但是对于样式表和源文档,保留的空白元素名称集的确定方式不同。