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.