xml – xpath获取特定的previous-sbeling的最后一个
这是非常简单的事情(至少我猜),我只是没有得到线索.
我必须解析一个大型XML文档以获取一个特定节点,该节点由其子节点值之一标识.到目前为止这很容易.但是当我尝试从该节点向前解析时,通过使用谓词选择其祖先的前兄弟,我得到一个节点列表,从那里我必须再次向下走. 在Theorie中,这是一个表,有5列和2行(在下面的例子中).我得到一个字段的id元素,需要找到行的第一个字段中给出的名称.第一个字段始终为“链接”类型,并且具有带文本的名称子节点 – 这是要获取的内容. 换句话说,我需要从任何节点移动< id> XXX_X< / i>到具有xsi:type =’Label’和名称节点控制的下一个前兄弟单元格.来自节点< id> MyItemId_1< />我需要从节点< id> MyItemId_4< / id>获得第二个前面的兄弟节点.我需要得到第5个兄弟姐妹. 这是一个示例xml片段: <cell> <control xsi:type="Label"> <id>1234</id> <name>MyOtherItemName</name> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Label"> <id>MyOtherItemId_0</id> <name/> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Label"> <id>MyOtherItemId_1</id> <name/> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyOtherItemId_2</id> <name>552</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyOtherItemId_3</id> <name>432</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyOtherItemId_4</id> <name>33</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Label"> <id>1234</id> <name>MyItemName</name> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Label"> <id>MyItemId_0</id> <name/> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Label"> <id>MyItemId_1</id> <name/> <message/> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyItemId_2</id> <name>552</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyItemId_3</id> <name>432</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> <cell> <control xsi:type="Button"> <id>MyItemId_4</id> <name>33</name> <message/> <type>Link</type> <selected>false</selected> </control> <selected>false</selected> <style>Odd</style> </cell> 我得到了这个xpath必须得到的项目: //cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id 它选择渲染表的单元格控件的id,即第二行的第4列. 从该节点开始,我尝试按照以下路径移动到该行中的第一个单元格: ../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name 这给了我表格第一列的两个正确单元格. <name>MyOtherItemName</name> * * * * * * * * * * <name>MyItemName</name> 现在它打破了我的背部,因为我无法让它回到所选择的两个中的最后一个. 我试过这个: ../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]][1]/control[name[node()]]/name 这是一个先前兄弟选择,其谓词正是我搜索的兄弟姐妹的类型,但似乎我无法将该谓词与[1]选择器结合起来.它不是选择所需的第一个前一个兄弟“MyItemName”,而是从前面的所有兄弟“MyOtherItemName”中选择第一个兄弟. 我需要帮助,希望这里有人有一个线索,可以指出我正确的方向. 正是我为实现这项工作而设置的是将xml复制到http://www.bit-101.com/xpath/中 //cell[control[type='Link']]/control[type='Link' and selected='false' and id='MyItemId_3']/id/../../preceding-sibling::cell[control[@xsi:type='Label' and name[node()]]]/control[name[node()]]/name
我不明白究竟是什么问题,但是兄弟姐妹从节点本身向文档的开头排序,即反过来比在文档中排序.要获得最近的前一个兄弟,请使用previous-sibling [1],以获得最远的兄弟(即文档顺序中的第一个),使用previous-sibling [last()].
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |