xpath多作用域:从多个树中选择数据

xpath多作用域:从多个树中选择数据,xpath,scope,nested,Xpath,Scope,Nested,问题:根据树的另一部分中的节点选择数据 如何使用label=“status”选择列的行中的数据 数据应为/result/rows/items/item/c/items/items/v 选择应基于label='status'即/result/cols/items/items/label=status 在下面的XML中,“status”是第2列,但它可能会更改为第1列,因此相应的XPath应该返回第1列的数据 <result> <cols> <item

问题:根据树的另一部分中的节点选择数据

如何使用label=“status”选择列的行中的数据

数据应为
/result/rows/items/item/c/items/items/v
选择应基于
label='status'
/result/cols/items/items/label=status

在下面的XML中,“status”是第2列,但它可能会更改为第1列,因此相应的XPath应该返回第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>

c1
结果
一串
c2
地位
一串
c3
消息
一串
数据1
数据2

我不知道你想要什么。但是,如果您正在寻找一个表达式,它将为所有带有文本“status”的标签获取“type”文本


你的描述不太清楚。 我是这样得到的:

有一个节点指示该列。该列的标签为“状态”。这个标签是你自己买的

/result/cols/items/item/label[text()='status']
但那不是你想要的。首先,您想知道该列位于哪个位置。你是靠你的努力得到这个职位的

count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1
但那仍然不是你想要的。根据该信息,您希望选择行中的实际数据。你和我吵架了

/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()

最后一个表达式不包含任何硬编码索引,仅使用列标题文本“status”来确定数据的位置。在您的示例中,它返回
data2
。如果您将列标题文本更改为“结果”,它将为您提供
data1

到目前为止您尝试了哪些代码?不清楚您在问什么。请将您期望的输出添加到您的问题中。这是完美的:)。唐克斯托马斯
/result/rows/items/item/c/items/item[count(/result/cols/items/item[label/text()='status']/preceding-sibling::*)+1]/v/text()