исправьте это выражение xpath, пожалуйста - PullRequest
1 голос
/ 28 июня 2010

Это часть моего 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 я вижу объект XML длиной 1. Но я не могу понять, как получить доступ к дочерним элементам «decal» или родным элементам «title».1007 *

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Если вам нужно выбрать наклейку на основе его названия, я бы предпочел следующие xpaths:

//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.Первые два примера являются типичными

0 голосов
/ 28 июня 2010

Я думаю, вы можете захотеть //decal[contains(./Title, 'Wood Horn with Blue Background')]

Это должно дать вам десятичный узел с дочерним узлом с именем «Заголовок», который содержит текст «Деревянный рог с синим фоном»

Чтобы получить доступ к родным элементам элемента Title, вы должны выбрать children узла, который он возвращает. (На самом деле возвращается декаль, а не заголовок.)

...