xpath 多范围:select 来自多棵树的数据
xpath multiple scope : select data from multiple trees
问题:select 数据基于树的另一部分中的节点
如何在带有标签 = "status" 的列的行中 select 数据?
数据应该是 "data2" 来自 /result/rows/items/item/c/items/item/v
selection 应该基于 label='status'
即 /result/cols/items/item/label=status
下面的XML中"status"是第2列,但可能会变成第1列,所以对应的XPath应该return第1列的数据
<result>
<cols>
<items>
<item>
<id>c1</id>
<label>result</label>
<type>string</type>
</item>
<item>
<id>c2</id>
<label>status</label>
<type>string</type>
</item>
<item>
<id>c3</id>
<label>message</label>
<type>string</type>
</item>
</items>
</cols>
<rows>
<items>
<item>
<c>
<items>
<item>
<v>data1</v>
</item>
<item>
<v>data2</v>
</item>
<item>
<v />
</item>
</items>
</c>
</item>
</items>
</rows>
</result>
我不确定你要问什么。但是,如果您正在寻找一个表达式,它将为所有带有文本 "status"
的标签获取 "type" 文本
//label[text()='status']/following-sibling::type
你的描述不是很清楚明白。
我是这样得到的:
有一个节点表示列。列的标签是 "status"。你得到这个标签
/result/cols/items/item/label[text()='status']
但这不是你想要的。首先,您想找出该列的位置。你得到那个位置
count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1
但这仍然不是你想要的。根据该信息,您想要 select 行中的实际数据。你得到了
的一行
/result/rows/items/item/c/items/item[2]/v/text()
但您并不总是想要该行的第二列,您希望该行基于之前确定的列索引。所以你需要结合两者:
/result/rows/items/item/c/items/item[count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1]/v/text()
最后一个表达式不包含任何硬编码索引,仅使用列 header 文本 "status" 来确定数据的位置。在您的示例中,它 returns data2
。如果您将列 header 文本更改为 "result",它会为您提供 data1
.
问题:select 数据基于树的另一部分中的节点
如何在带有标签 = "status" 的列的行中 select 数据?
数据应该是 "data2" 来自 /result/rows/items/item/c/items/item/v
selection 应该基于 label='status'
即 /result/cols/items/item/label=status
下面的XML中"status"是第2列,但可能会变成第1列,所以对应的XPath应该return第1列的数据
<result>
<cols>
<items>
<item>
<id>c1</id>
<label>result</label>
<type>string</type>
</item>
<item>
<id>c2</id>
<label>status</label>
<type>string</type>
</item>
<item>
<id>c3</id>
<label>message</label>
<type>string</type>
</item>
</items>
</cols>
<rows>
<items>
<item>
<c>
<items>
<item>
<v>data1</v>
</item>
<item>
<v>data2</v>
</item>
<item>
<v />
</item>
</items>
</c>
</item>
</items>
</rows>
</result>
我不确定你要问什么。但是,如果您正在寻找一个表达式,它将为所有带有文本 "status"
的标签获取 "type" 文本//label[text()='status']/following-sibling::type
你的描述不是很清楚明白。 我是这样得到的:
有一个节点表示列。列的标签是 "status"。你得到这个标签
/result/cols/items/item/label[text()='status']
但这不是你想要的。首先,您想找出该列的位置。你得到那个位置
count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1
但这仍然不是你想要的。根据该信息,您想要 select 行中的实际数据。你得到了
的一行/result/rows/items/item/c/items/item[2]/v/text()
但您并不总是想要该行的第二列,您希望该行基于之前确定的列索引。所以你需要结合两者:
/result/rows/items/item/c/items/item[count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1]/v/text()
最后一个表达式不包含任何硬编码索引,仅使用列 header 文本 "status" 来确定数据的位置。在您的示例中,它 returns data2
。如果您将列 header 文本更改为 "result",它会为您提供 data1
.