简单的XSLT,其中IF测试失败

时间:2015-07-16 15:51:53

标签: xml xslt

我有一个简单的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条件。并跳过替换元素。为什么这个测试失败了?

3 个答案:

答案 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以其他方式处理之前,一些文本节点被剥离。除非文本节点仅包含空格字符,否则永远不会剥离文本节点。剥离文本节点会从树中删除文本节点。剥离过程将一组必须保留空白的元素名称作为输入。剥离过程适用于样式表和源文档,但是对于样式表和源文档,保留的空白元素名称集的确定方式不同。