views:

28

answers:

2

I have a given XML document (structure can not be changed) and want to get the comments that are written above the nodes. The document looks like this:

<!--Some comment here-->    
    <attribute name="Title">Book A</attribute>
    <attribute name="Author">
       <value>Joe Doe</value>
       <value>John Miller</value>
    </attribute>
<!--Some comment here-->
    <attribute name="Code">1</attribute>

So comments are optional, but if there is one, I want to get the comment above each attribute. Using /*/comment()[n] would give me comment n, but for n=2 I would naturally get the comment of the third attribute, so there is no connection between attributes and comments Any ideas? Thanks

A: 

If you want to select the comments that are followed by an attribute element, then this should work:

/*/comment()[following-sibling::*[position()=1 and name()='attribute']]
Mads Hansen
great, that was exactly what I was looking for. Thank you
Sebastian
A: 

Use:

//comment()[following-sibling::*[1][self::attribute]]

This is more compact and precise than the currently selected answer. The // abbreviation is necessary, since no wellformed XML document was provided and the nesting level of the comment nodes is not known.

Dimitre Novatchev
I see, thank you
Sebastian