xpath:如何将以下xml转换为结果数据格式?

时间:2011-08-09 00:58:45

标签: html xml xpath

示例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> xpath表达式捕获所有//span标记,并查看每个<span>标记为<h1> }&amp;其中<a>

2 个答案:

答案 0 :(得分:1)

您可以使用h1选择所有//h1,然后选择h1的两个兄弟,即:following-sibling::*[position() < 3]

答案 1 :(得分:1)

由于缺少XPath 2.0中存在的string-join()函数,因此很难在XPath 1.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。