XSL if: 多个测试条件的测试

38

我正在尝试创建一个XSL条件来检查节点组合是否为空。我已经尝试了下面的条件,但它们并不起作用,有人知道如何让它工作吗?

<xsl:if test=" node/ABC!='' and node/DEF='' and node/GHI='' ">
This does not work
</xsl:if>

我也尝试过

<xsl:when test="((node/ABC!='') and (node/DEF='') and (node/GHI=''))">
This does not work either..
</xsl:when>

并且也尝试了

<xsl:if test="(node/ABC!='')>
<xsl:if test="(node/DEF='')>
<xsl:if test="(node/GHI='')">
Nope not working..
</xsl:if>
</xsl:if>
</xsl:if>

我尝试使用单个xsl:if条件,以下是观察结果

<xsl:if test="node/ABC!=''>
**This is working fine**
</xsl:if>

然而,如果我尝试搜索空条件,即

<xsl:if test="node/ABC=''>
**This does not work**
</xsl:if>

此外,如果我尝试使用“==”(双等于号),那么它会产生XSLT错误。即

<xsl:if test="node/ABC==''>
***This gives a compilation error***
</xsl:if>

我希望能够获得帮助,以弄清如何使我的xsl:if测试能够检查多个条件。

[编辑]:在此更新,如果所有节点都不为空的情况下if条件是起作用的,但当我尝试检查其他任何一个空节点时,它就不起作用了。

例如:

<xsl:if test=" node/ABC!='' and node/DEF!='' and node/GHI!='' ">
This condition works perfectly fine.
</xsl:if>

3
请给出你的XML示例。同时要注意,包含空格的元素在XPath中并非为空。您可能需要查找“normalize-space”函数。 - Ian Roberts
嘿@IanRoberts,我正在一个需要XSLT查看数据的Web应用程序中工作。不确定如何获取XML。但是,我还尝试了normalize-space函数(normalize-space表示该节点可能具有空格(?))。我正在测试的列没有值。 - codingbbq
1
你可以使用身份转换来返回与原始XML相同的内容。有许多原因可能导致它无法正常工作,例如多余的空格、命名空间不匹配、大小写敏感、上下文不是您想象的那样等等。如果没有看到输入,就无法诊断问题。 - Ian Roberts
谢谢@IanRoberts,我明白我的问题不完整,我会尝试从支持部门获取更多信息。 - codingbbq
嗨@IanRoberts,谢谢,normalize-space函数对我有用。 - codingbbq
显示剩余2条评论
3个回答

37

多亏了@IanRoberts,我不得不在我的节点上使用normalize-space函数来检查它们是否为空。

<xsl:if test="((node/ABC!='') and (normalize-space(node/DEF)='') and (normalize-space(node/GHI)=''))">
  This worked perfectly fine.
</xsl:if>

6

为了完整性和那些不知道的人,XSL 1 提供了选择多个条件的选项。

<xsl:choose>
 <xsl:when test="expression">
  ... some output ...
 </xsl:when>
 <xsl:when test="another-expression">
  ... some output ...
 </xsl:when>
 <xsl:otherwise>
   ... some output ....
 </xsl:otherwise>
</xsl:choose>

3

尝试使用empty()函数:

<xsl:if test="empty(node/ABC/node()) and empty(node/DEF/node())">
    <xsl:text>This should work</xsl:text>
</xsl:if>

这段代码将ABCDEF标识为空,因为它们没有任何子节点(没有元素、文本节点、处理指令或注释)。

但是,正如@Ian所指出的那样,你的元素可能并不真正为空,或者这可能不是你实际遇到的问题——你没有展示你的输入XML长什么样。

错误的另一个原因可能是你在树中的相对位置。只有当周围的模板匹配node的父元素或者你迭代node的父元素时,才能使用这种条件测试方式。


1
嗨@Mathias,我确实尝试了上面的if条件,但它在我使用的Web应用程序中给出了一个XSLT无效错误。 - codingbbq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接