Reputation: 31739
I have the xml below that I've pasted here with this rule:
/bookstore/book/price/text()
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
When I submit the form, the prices are remarked.
Now I'm trying to do the same with this xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SearchResponse xmlns="http://www.liberologico.com/dbsite/jolly-search">
<GlobalFilter>
<Filters>
<Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
<Field>aptve_territorio</Field>
<Value>
<TreeValue>
<Value>*</Value>
</TreeValue>
</Value>
</Filters>
<Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
<Field>full_text_search</Field>
<Value>
<SingleValue>*</SingleValue>
</Value>
</Filters>
<Filters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="FilterSpecType">
<Field>lang</Field>
<Value>
<SingleValue>it</SingleValue>
</Value>
</Filters>
</Filters>
</GlobalFilter>
</SearchResponse>
and this rule:
/SearchResponse/GlobalFilter/Filters/Filters/Field/Value/Treevalue/Value/text()
I expected the site remarks the "*" but it doesn't.. why?
Javi
Upvotes: 0
Views: 87
Reputation: 338386
That's because there is an XML default namespace involved (see the xmlns="http://www.liberologico.com/dbsite/jolly-search"
declaration).
An XPath expression like /SearchResponse
will match nothing since there actually is no element of that name (an element's namespace always counts into its name).
Unless you tell the server to look at elements specifically in this namespace, it will never find them.
You can work around this by either specifying that you're looking for elements in any namespace (the local-name()
function extracts the plain element name):
//*[local-name() = 'Treevalue']/*/text()
or by telling the server that a namespace is involved, giving it a prefix (say, js
) and issuing an XPath search for fully qualified names:
//js:Treevalue/*/text()
The first method is easy since there is no code change required on the server side. Then again it requires long-winded and ugly XPath expressions. The second method requires implementing namespace support on the server but XPath expressions will be nice and clean.
The third method would be to remove the namespace declaration from the XML before you send it to the server, but – depending on your situation – that might not be feasible.
Upvotes: 2
Reputation: 143269
Value
is not a child of Field
(You have Field/Value
there).
Upvotes: 1