Сопоставление узла на основе значения родственника с помощью XPath

89

Имея такой XML-документ:

<?xml version="1.0" encoding="UTF-8"?>
<records type="array">
  <record>
    <name>svn</name>
    <record-type>A</record-type>
    <ttl type="integer">86400</ttl>
    <zone-id type="integer">69075</zone-id>
    <aux type="integer">0</aux>
    <id type="integer">xxx</id>
    <active>Y</active>
    <data>xxx.xxx.xxx.xxx</data>
  </record>
  <record>
    <name>domain.tld.</name>
    <record-type>NS</record-type>
    <ttl type="integer">86400</ttl>
    <zone-id type="integer">xxx</zone-id>
    <aux type="integer">0</aux>
    <id type="integer">xxx</id>
    <active>Y</active>
    <data>domain.tld.</data>
  </record>
  <record>
    <name>blog</name>
    <record-type>A</record-type>
    <ttl type="integer">86400</ttl>
    <zone-id type="integer">xxx</zone-id>
    <aux type="integer">0</aux>
    <id type="integer">xxx</id>
    <active>Y</active>
    <data>xxx.xxx.xxx.xxx</data>
  </record>
</records>

Как сопоставить ценность всех /records/record/nameбратьев и сестер ?/records/record/record-typeA

Флавий
источник

Ответы:

58

Удивительно, но ни один из ответов на этот старый вопрос на сегодняшний день не дает простейшего решения XPath.

Этот простой XPath

/records/record[record-type = "A"]/name

выбирает

<name>svn</name>
<name>blog</name>

как просили.

Kjhughes
источник
39

Вы также можете фильтровать родительский элемент по его дочерним элементам:

/records/record[record-type[text()='A']]/name

Томасб
источник
6
Это проще и понятнее для тестирования record-typeнепосредственно без дополнительного предиката.
kjhughes