97

Having a XML document like this:

<?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> 

How to match all the /records/record/name having as sibling /records/record/record-type with the value A?

3 Answers 3

112

Found it:

/records/record/name[../record-type/text() = "A"] 
Sign up to request clarification or add additional context in comments.

1 Comment

It's simpler and clearer to test record before descending to name.
69

Surprisingly, none of the answers to date on this old question provide the simplest XPath solution.

This simple XPath

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

selects

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

as requested.

Comments

38

You can also filter a parent element by its children :

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

1 Comment

It's simpler and clearer to test record-type directly without an additional predicate.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.