28
votes

In below XML:

<company>
    <customers>
    <customer cno="2222">
            <cname>Charles</cname>
            <street>123 Main St.</street>
            <city>Wichita</city>
            <zip>67226</zip>
            <phone>316-636-5555</phone>
        </customer>
        <customer cno="1000">
            <cname>Bismita</cname>
            <street>Ashford Dunwoody</street>
            <city>Wichita</city>
            <zip>67226-1555</zip>
            <phone>000-000-0000</phone>
        </customer>     
    </customers>
</company>

I need to get the customer's no which is an attribute. In XPath I know it is /company/customers/customer/@cno, in XQuery I've tried below expression but didn't work for me:

for $c in /company/customers/customer
return $c/@cno
2
XQuery uses plain XPath; your attempt works for me. What does return $c give you? - Tomalak
I'm using EditX software for this, but it show error "Cannot create an attribute node whose parent is document node." Can you please let me know in which tool you try this, so I can switch to that tool. May be it is tool specific issue. - Itz.Irshad
Sometimes searching for the exact error message does wonders. It turned up this question as the first hit for me, I'm sure it would have done the same for you. - Tomalak
You can also use the shorter /company/customers/customer/@cno/data() which doesn't require an explicit loop. - Jens Erat

2 Answers

53
votes

You should use data to pick attribute value:-

for $c in /company/customers/customer
return data($c/@cno)
14
votes

You can also use string to get attribute value:

for $c in /company/customers/customer
    return $c/@cno/string()