Навигация по столбцам таблицы HTML с XPath 1.0 - PullRequest
1 голос
/ 09 августа 2010

Используя только выражение XPath (а не в XSLT или DOM - просто чистый XPath), я пытаюсь создать относительный путь от текущего узла (в тд) к связанному тд в том же столбце того же HTML таблица.

Например, предположим, у меня есть такой тип данных:

<table>
  <tr> <td><a>Blue Jeans</a></td> <td><a>Shirt</a></td> </tr>
  <tr> <td><span>$21.50</span></td> <td><span>$18.99</span></td> </tr>
</table>

и я с "Голубыми джинсами" и хочу найти цену ($ 21,50). В XSLT я мог бы использовать функцию current (), чтобы получить такой ответ:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:apply-templates select="//a" />
    </xsl:template>

    <xsl:template match="a"> 
        Name: <xsl:value-of select="."/>
        Price: <xsl:value-of select="../../following-sibling::tr[1]/td[position() = count(current()/../preceding-sibling::td) + 1]" />
    </xsl:template>

</xsl:stylesheet>

Но проблема, с которой я сталкиваюсь, заключается в том, что в XPath 1.0 не определен current (). Я пытался использовать self :: axis, но вроде "." сокращение, которое указывает только на узел «context», а не на «текущий» узел. Язык, который я вижу в стандарте XPath , предполагает, что XPath не имеет понятия «текущий узел».

Возможно, есть другой способ сформировать этот путь или это ограничение XPath?

Ответы [ 2 ]

1 голос
/ 10 августа 2010

В XPath 1.0 вы можете сделать:

/table/tr/td/a[.='Blue Jeans']/following::td[count(../td)]/span

Конечно, это предполагает отсутствие colspan.

РЕДАКТИРОВАТЬ : доказательство.Эта таблица стилей:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:param name="pProduct" select="'Blue Jeans'"/>
    <xsl:template match="/">
        <xsl:value-of select="/table/tr/td/a[.=$pProduct]
                                    /following::td[count(../td)]/span"/>
    </xsl:template>
</xsl:stylesheet>

Вывод:

$21.50

С параметром pProduct, установленным на 'Shirt', вывод:

$18.99

Примечание: Конечно, вам нужен элемент a в контексте, чтобы выбрать элемент span.Итак, с вашей таблицей стилей:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text"/>
    <xsl:template match="text()"/>
    <xsl:template match="a">
        Name: <xsl:value-of select="."/>
        Price: <xsl:value-of select="following::td[count(../td)]/span" />
    </xsl:template>
</xsl:stylesheet>

Вывод:

Name: Blue Jeans
Price: $21.50
Name: Shirt
Price: $18.99
0 голосов
/ 09 августа 2010

Этого невозможно достичь с помощью одного выражения XPath 1.0 .

В XPath 2.0 можно написать:

for $vPreceeding in count(../preceding-sibling::td)
  return ../../following-sibling::tr[1]/td[$vPreceeding]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...