Функция XPath normalize-space () и start-with () не находят etem с правильным значением для элемента - PullRequest
3 голосов
/ 21 сентября 2011

У меня есть фрагмент такого 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')]

, я найду список предметов, который содержит «Кейс», но мне нужен только один с «Кейс» и не больше символов.Может быть, я делаю что-то не так, просто хочу, чтобы это было ясно для меня.


Мой коллега сказал мне, что я могу использовать этот XPath

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

, просто пропустите это место.Я узнаю, что это работа!но мне кажется, есть другой способ решить мою проблему без пропуска или пропуска.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Используйте

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

XPath не поддерживает сущности и normalize-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>
0 голосов
/ 22 сентября 2011

Вы также можете попробовать // a [match (., '^ \ W * Case \ W * $')], который будет сопоставлять элементы со значением «Case», возможно окруженные другими несловесными символамивсе, кроме букв, цифр и _ я думаю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...