xpath: как преобразовать следующий XML в результирующий формат данных? - PullRequest
1 голос
/ 09 августа 2011

ПРИМЕР 1:

<body>
    <div>
    <h1>category1</h1><a>sibling1</a><a>sibling2</a><h1>category2</h1><a>sibling3</a><a>sibling4</a>
    </div>
</body>

так что у них нет общего предка, кроме того, что они находятся под одним div. Как вы сможете создать (что можно выразить с помощью xpath) следующий результирующий строковый формат данных?

category1,sibling1,sibling2;
category2,sibling3,sibling4;

если ПРИМЕР 1 был примерно таким:

    <body>
        <div>
<span>
        <h1>category1</h1><a>sibling1</a><a>sibling2</a>
</span>
<span>
        <h1>category2</h1><a>sibling3</a><a>sibling4</a>
</span>
        </div>
    </body>

здесь, в этом случае, это довольно просто, все, что требуется, - это захватить все теги <SPAN> с помощью выражения //span xpath и просмотреть каждый тег <span> для его <h1> & <a> внутри него.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Результирующую строку трудно получить в XPath 1.0 из-за отсутствия функции string-join(), присутствующей в XPath 2.0.

В общем, если вы можете выполнять итерацию на каждом узле h1, вы можете использовать следующий xpath для выбора всех текстов смежных братьев и сестер до следующего h1 (например, для первого h1):

"/html/body/div/h1[1]//text()
|
/html/body/div/h1[1]/following-sibling::*
[count( . | following-sibling::h1[1]/preceding-sibling::* )
 = count( following-sibling::h1[1]/preceding-sibling::* )]//text()"

Для последнего узла h1 путь очень прост:

"/html/body/div/h1[last()]//text()
|
/html/body/div/h1[last()]/following-sibling::*//text()"

В XPath 2.0 вы можете объединять строки напрямую следующим образом:

string-join(xpath,',')

где вы можете xpath, как указано выше.

1 голос
/ 09 августа 2011

Вы можете выбрать все h1, используя //h1, затем выберите двух братьев и сестер h1, т.е.: following-sibling::*[position() < 3]

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