2011-09-12 17 views
0

我有一个XSLT声明如下:<address1/>什么样的价值是在地址

<xsl:when test="address1 != ' '"> 

我进来的XML地址节点如下:

<address1/> 

节点存在和XSL声明似乎有时工作,但它并不总是工作,它给我不一致的结果。我正在检查address1节点,如果它是空格,那么我检查address2节点,如果它不是空格,我将它移动到address1输出字段,如果address1输入是空格。我们的客户在输入地址时非常不一致,我们的供应商要求address1有效。谢谢你的帮助。

+0

好问题,+1,因为你会学习使用标准XPath函数'normalize-space()'。 –

回答

0

该节点为空。

您正在测试它不是单个空间' ',如果它是一个空节点,则测试将成功。

为了测试该节点是空的,你可以这样做:

<xsl:when test="address1 = ''"> 
+0

你如何检查一个空节点 –

+0

@丹尼斯 - 答案更新。 – Oded

0

的自闭标签不应该有内容,所以检查''将要走的正确方法。做'[space]'意味着标签实际上是<address1>[space]</address1>,它不再是自动关闭。

+0

我试图欺骗它为'',它仍然无法正常工作 –

2

检查字符串的问题是您实际检查元素的所有后代中的文本,因此<foo><bar>test</bar></foo>将因测试foo = ''失败,因为文本test存在于树内。

更确凿的测试是: address1[not(text()) and not(*)]

这仅通过其中存在的地址元素中既不文本也不子元素。

0

你没有告诉我们足够的关于你的代码,我们可以可靠地告诉你它有什么问题。别那么沉默!可能存在各种各样的问题,这些问题在一小段片断中并不明显。使用错误的上下文项目。

一条建议,尽管:避免“!=”运算符(它出现在你的例子中)。通常你需要not(author='')而不是author!=''。如果只有一个author元素,它们的意思是一样的,但如果没有author元素或者多于一个,则它们具有不同的含义。如果至少有一个author值不是空字符串,则表达式author!=''为true;如果没有其值为空字符串的作者元素,则表达式not(author='')为真。

0

要检查是否一个元素的字符串值非空和非空白只使用

string-length(normalize-space(address1)) > 0 

标准XPath函数normalize-space($s)采用字符串$s作为参数并返回另一个串从$s产生,其中删除所有前导空白字符和尾随空白字符,并将任何一组相邻临时空白字符替换为单个空格字符。

这意味着当应用于仅包含空格字符的字符串时,normalize-space()的结果为空字符串(具有string-length()0)。

XPath表达式以上正在测试如果施加normalize-space()函数的address1字符串值的结果具有正(> 0)长度 - 这意味着address1字符串值包含至少一个非空白字符。