我正在努力解决XPath问题。在SQL术语中,我正在尝试连接两个列表,并使用另一个列表中的属性从一个列表中选择元素。
我的XML文档:
<DOSSIER>
<PRODUCT_DEF>
<NUMBER>1</NUMBER>
<SHOW>true</SHOW>
</PRODUCT_DEF>
<PRODUCT_DEF>
<NUMBER>2</NUMBER>
<SHOW>false</SHOW>
</PRODUCT_DEF>
<CONTRACT>
<NUMBER>11</NUMBER>
<PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER>
</CONTRACT>
<CONTRACT>
<NUMBER>22</NUMBER>
<PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER>
</CONTRACT>
<CONTRACT>
<NUMBER>33</NUMBER>
<PRODUCT_DEF_NUMBER>2</PRODUCT_DEF_NUMBER>
</CONTRACT>
<CONTRACT>
<NUMBER>44</NUMBER>
<PRODUCT_DEF_NUMBER>1</PRODUCT_DEF_NUMBER>
</CONTRACT>
</DOSSIER>
所以我试图选择相应PRODUCT_DEF / SHOW = true的所有CONTRACT元素。 CONTRACT_DEF / VOLGNUM与CONTRACT / PRODUCT_DEF_NUMBER
相关在我的尝试中,我试图加入这两个元素,但我认为在CONTRACT元素中突然引用一个完全不同的元素是不可能的:
//CONTRACT[..//PRODUCT_DEF[NUMBER=./PRODUCT_DEF_NUMBER]/SHOW="true"]
结果应该是两个节点的列表,包含:
合同[NUMBER = 11],
合同[NUMBER = 44]
这甚至可能吗?
也许我应该分两步完成它?
感谢您的帮助!
答案 0 :(得分:1)
一般情况下,XPath使用//
是一个错误(它会搜索所有元素,因此难以控制,也会变慢)。
基本选择为/DOSSIER/CONTRACT[condition]
,这意味着condition
将CONTRACT
元素作为上下文节点(这是.
将引用的内容)。因此
要进入条件需要PRODUCT_DEF
的{{1}}节点,但这意味着产品状态的任何子条件都将使用该./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF/NUMBER
子节点作为其上下文,但可以将条件应用于NUMBER
节点。因此
期待您需要以下内容:
PRODUCT_DEF
但是,我可能会更改为/DOSSIER/CONTRACT[./PRODUCT_DEF_NUMBER = ../PRODUCT_DEF[./SHOW = 'true']/NUMBER]
使用绝对路径以及删除不必要的PRODUCT_DEF
,以便更容易看到正在发生的事情:
./
PS。我讨厌所有的帽子,为什么有些人想要保留这些古代系统的人工制品?因此可能存在拼写错误。