请更正此xpath表达式

时间:2010-06-27 21:42:45

标签: javascript xml dom contains xpath

这是我的XML文档的一部分:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<mfVictor>
 <decal>
    <company>Victor</company>
    <title>Wood Horn with Blue Background</title>
    <image>
      <url>victor01.jpg</url>
      <width>60</width>
      <height>60</height>
      <name>Wood Horn Blue Background</name>
      <link></link>
    </image>
    <price>$15.00</price>
    <instock>In Stock</instock>
    <notes>none</notes>
  </decal>
</mfVictor>
</catalog>

我有一个函数可以生成每个“title”元素的文本列表。那么,我想要导航到“贴花”并访问其所有子节点的每个列表项。到目前为止,我有这个:

//decal[contains(.,\'"+itemName+"\')]

其中itemName是this.innerHTML传递给函数。看起来像是访问了贴花,因为在console.log中我可以看到长度为1的XML对象。但我无法弄清楚如何访问“贴花”的子节点或“标题”的兄弟节点。 / p>

感谢阅读。

2 个答案:

答案 0 :(得分:1)

如果您需要根据标题选择贴花,我更喜欢以下xpath:

//decal/title[contains(.,\'"+itemName+"\')]/parent::node()
//decal/title[contains(.,\'"+itemName+"\')]/..
//decal[title[contains(.,\'"+itemName+"\')]]

选择您可以使用的贴花标题的兄弟

//decal/title[contains(.,\'"+itemName+"\')]/following-sibling::*

如果你想要你选择的贴花的所有孩子,你可以使用(也许你需要这个)

//decal[title[contains(.,\'"+itemName+"\')]]/child::*

或更好,如果你有完整的标题

//decal[title[text()=\'"+itemName+"\']]/child::*

使用方括号,您可以指示解析器遍历xml树,以根据您指定的条件进行选择,但不更改上下文节点。将方括号视为橡皮带,一旦包含在其中的测试满足,解析器将恢复到起始节点并评估其余的xpath表达式。前两个例子是一个典型的

答案 1 :(得分:0)

我想你可能想要//decal [包含(./标题,'带有蓝色背景的木角')]

这应该为您提供带有名为“Title”的子节点的贴花节点,该节点包含“带有蓝色背景的Wood Horn”文本

要访问Title元素的兄弟元素,您需要选择返回的节点的 children 。 (它实际上是返回贴花节点,而不是标题节点。)