2011-03-10 87 views
1

XSLT 1.0 contains()函数和空标记存在问题。XSLT包含()和空标记

我有这样的XSLT样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="test/tester"> 
      <test> 
       <xsl:value-of select="."/> 
       <xsl:text>: </xsl:text> 
       <xsl:value-of select="contains('11,22,33', .)"/> 
      </test> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

和输入是这样的:

<?xml version="1.0" encoding="UTF-8"?> 
<test> 
    <tester>11</tester> 
    <tester>22</tester> 
    <tester>33</tester> 
    <tester>xx</tester> 
    <tester/> 
</test> 

结果是这样的:在这里

<?xml version="1.0" encoding="UTF-8"?> 
<test>11: true</test> 
<test>22: true</test> 
<test>33: true</test> 
<test>xx: false</test> 
<test>: true</test> 

问题是,我希望功能如果<tester>标签为空则返回false。然而它对于最后一行是正确的。我怎样才能避免这种情况,除了首先检查空值的标签值并将变量设置为某个值,我知道该值不在值列表中?

谢谢!

+0

但'FN:contains'正常工作,因为你的字符串实际上包含一个空字符串。你应该通过f.i来改变逻辑。使用'contains'处理仅包含具有内容或其他内容的标签。 – 2011-03-10 07:38:23

+0

@Alex我会理解,如果空字符串包含空字符串,但不是'11,22,33'包含空字符串。但那只是我:) – Jari 2011-03-10 07:55:59

+0

好问题,+1。请参阅我的回答以获得解释和完整,简短和简单的解决方案。 :) – 2011-03-10 14:03:38

回答

2

这是标准,根据W3C Spec行为

为了避免这种情况,使用

contains(',11,22,33,', concat(',', ., ',')) 
+0

+1通用XPath 1.0“顺序”表达式。 – 2011-03-10 17:59:55

+0

谢谢,有用的提示! – Jari 2011-03-14 06:49:46

+0

@Jari:不客气。 – 2011-03-14 12:44:22

2

的XPath 1.0规范是对此事很模糊,但XQuery 1.0和XPath 2.0中的功能规格explicitly declares

If the value of $arg2 is the zero-length string, then the function returns true. 

我不认为这是一个新的东西,只是一个澄清的旧功能。

+0

+1正确的解释。在逻辑上,任何集都包含空集。 – 2011-03-10 17:59:13

+0

谢谢,应该检查一下自己。 – Jari 2011-03-14 06:59:54