Как получить строки вложенной таблицы HTML с помощью XSLT - PullRequest
4 голосов
/ 23 января 2012

Я пытаюсь получить строки таблицы из XHTML, используя XPath / XSLT.Мой пример xhtml выглядит следующим образом:

<body>
<....>
   <table>
     <tbody>
       <tr>
         <td/>
         <td/>
         <td>
            <table>
              <tr>
                <....>
              </tr>
            </table>
         </td>
       </tr>
     </tbody>
   </table>
</body>

В приведенной выше структуре <tbody> может быть или не быть там.Таблицы могут быть вложены на любой уровень.Теперь я хочу получить все строки для данной таблицы.Поэтому, когда я обрабатываю внешнюю таблицу, я хочу получить только внешнюю строку (содержащую 3 tds), но не внутреннюю tr (внутри вложенной таблицы).Как я могу сделать это, используя XSLT или XPath?

Редактировать: По сути, я ищу способ получения всех потомков :: y для узла x, но y не должен быть потомком другой х.Путь от x-> y не должен содержать другой x.У меня может не быть ничего, что отличает внешний x от внутреннего x.

Примечание: я пытаюсь сделать это со многими HTML, которые имеют разную структуру, и я не могу изменить структуру любого файла HTML - этодается мне.Единственное, что они все хорошо сформированы XHTML.

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Следующее выражение выбирает элементы tr любого элемента table, который не имеет table в качестве предка (т. Е. Только самые внешние таблицы) и который может иметь или не иметь элемент tbody:

//table[not(ancestor::table)]/tbody/tr|//table[not(ancestor::table)]/tr

Это объединение двух отдельных выражений, одно из которых выбирает правильный элемент, когда присутствует tbody, а другое - когда его нет.

0 голосов
/ 24 января 2012

По сути, я ищу способ получить все descendant::y для узла x, но y не должен быть потомком другого x.

Предположим, $ n - это элемент с именем x.Вы хотите :

$n//y[count(ancestor::x) = count($n/ancestor-or-self::x)]

Это выбирает все y, которые являются потомками $ n и имеют такое количество x предков, которое ровно на один больше, чем число предка ::x из $ n.

Поскольку $n содержит элемент x, это означает, что для всех выбранных y x, содержащийся в $n, является их первым ancestor::x.

Для практических целей вам нужно только заменить $n выше точным выражением XPath, которое выбирает элемент x, который он содержит.

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