SOAP UI中断言的Xpath表达式:我们如何处理特殊符号,如撇号,用于节点值,如Abc的工作

时间:2016-10-06 16:27:48

标签: xpath soapui xpath-2.0

我们如何检查节点retun中的值的值,即

Hurricane&Grill; Darling Harbour

实际上,我无法用下面的代码选择撇号 存在(// ns1:name [text()=' Hurricane' s Grill Darling Harbour'])。

收到错误消息: RuntimeException:net.sf.saxon.trans.XPathException:{... name [text()=' Hurricane' s Gr ...}中第2行的char 33处的XPath语法错误:预期"]",找到姓名" s"

2 个答案:

答案 0 :(得分:2)

  

我无法使用以下代码选择撇号   存在(// ns1:name [text()='Hurricane's Grill Darling Harbour'])。

     

获取错误消息 RuntimeException:net.sf.saxon.trans.XPathException:{... name [text()='中第2行的char 33处的XPath语法错误飓风的Gr ...}:   预期“]”,找到名字“s

在XPath 2.0中,只需将该字符加倍即可转义撇号或双引号。请参阅此处的规则[75][76] http://www.w3.org/TR/xpath20/#terminal-symbols

使用

exists(//ns1:name[text()='Hurricane''s Grill Darling Harbour'])

基于XSLT 2.0的验证

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ns1="ns1">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:sequence 
         select="exists(//ns1:name[text()='Hurricane''s Grill Darling Harbour'])"/>
  </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<ns1:name xmlns:ns1="ns1">Hurricane's Grill Darling Harbour</ns1:name>

产生了想要的正确结果

true

如果您只能在XML文档中使用XPath 1.0表达式而该字符串包含两种引号,请使用:

boolean(//ns1:name
   [text()=concat('Hurricane &quot;Mathew&quot;',  &quot; strength&apos;s value&quot;)])

以下是基于XSLT 1.0的完整验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ns1="ns1">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:value-of select=
      "boolean(//ns1:name
  [text()=concat('Hurricane &quot;Mathew&quot;',  &quot; strength&apos;s value&quot;)])"/>
  </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<ns1:name xmlns:ns1="ns1">Hurricane "Mathew" strength's value</ns1:name>

产生了想要的正确结果

true

答案 1 :(得分:2)

Saxon 开始支持部分XPath 2.0 requeriments in 7.0 version.

SOAPUI版本5.1.2使用 Saxon 9.1版本( Saxon 新版本的更改历史记录可以查看here

然后,正如@DimitreNovatchev完美解释的那样,在文本中为'转义XPath 2.0的可能选项是将符号加倍为''

exists(//ns1:name[text()='Hurricane''s Grill Darling Harbour'])

我只想增加另一种可能性;由于"引号也有效,因此您可以使用"内部使用'来包装整个文本。因此,在您的SOAPUI XPath match断言中,您可以使用:

exists(//ns1:name[text()="Hurricane's Grill Darling Harbour"])

注意我的目的是这样,因为我假设您只在 XPath 中使用'查找节点文本。如果您还需要在"包含的文字中使用",则必须将"加倍'

另请注意,在SOAPUI中,可以使用*作为命名空间的通配符,以便减少表达式:

declare namespace ns='http://somenamespace/';
exists(//ns1:name[text()="Hurricane's Grill Darling Harbour"])

要:

exists(//*:name[text()="Hurricane's Grill Darling Harbour"])