XPath函数normalize-space()和starts-with()在项目之前找不到项目

时间:2011-09-21 14:16:53

标签: xpath

我有一些这样的HTML代码

<td>
<a href="CMenu?op=m&menuID=42&rurl={{rurl}}" title="Edit menu">
<img border="0" alt="" src="Images/application.gif">
&nbsp;Case
</a>
</td>

需要找到文字“案例” 我使用不同的XPath查询,但没有人是好的,都找不到任何东西:

//a[text() = ' Case']
//a[text() = 'Case']
//td/a[normalize-space(text()) = 'Case']
//td[a[normalize-space(.) = 'Case']]
//td[a[normalize-space(text()) = 'Case']]
//*[starts-with(.," Case")]
//*[starts-with(.,"Case")]

但是,当我尝试用

找到这个项目时
//a[contains(.,'Case') and string-length() = 5]

它可以工作,但是我不能接受硬代码'5',我想把这个XPath多功能用于其他相关项目。
如果我使用

//a[contains(.,'Case')]

我找到一个包含'Case'的项目列表,但只需要一个包含'Case'而不是更多chars的项目。 也许我做错了什么,只想把它告诉我。


我的同事告诉我,我可以使用这个XPath

//a[substring(text(),2)='Case']

跳过这个空间。我发现它的功能!但在我看来,还有另一种解决我的问题的方法,没有任何跳过或通过。

2 个答案:

答案 0 :(得分:4)

使用

/td/a
      [starts-with(normalize-space(), '&#xA0;Case')]

XPath不是实体感知的,normalize-space()根据定义只处理空白字符:space,NL,CR和Tab - 所以&#xA0;(这是实体&nbsp;被展开的内容不被视为空格字符。

基于XSLT的验证

此转换选择上述XPath表达式并输出结果

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

 <xsl:template match="/">
  <xsl:copy-of select=
  "/td/a
      [starts-with(normalize-space(), '&#xA0;Case')]
   "/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<td>
<a href="CMenu?op=m&amp;menuID=42&amp;rurl={{rurl}}" title="Edit menu">
<img border="0" alt="" src="Images/application.gif"/>
&#xA0;Case
</a>
</td>

产生了想要的正确结果

<a href="CMenu?op=m&amp;menuID=42&amp;rurl={{rurl}}" title="Edit menu">
  <img border="0" alt="" src="Images/application.gif" />
 Case
</a>

答案 1 :(得分:0)

您可能还想尝试//匹配[匹配(。,'^ \ W * Case \ W * $')],它们将匹配值为“Case”的元素,可能包含其他一些非单词字符(除了字母,数字和_之外的任何事情我都认为。)