Mikhail Teterin wrote:
>Joseph J. Kesselman wrote:
>> XPath is namespace-aware. To select a namespaced node, you must use a
>> prefix in your path (which you did) and tell your XPath evaluator what
>> the prefix bound to (which you didn't). Look at the user's manual for
>> your tool.
>
>Thanks. After I explicitly set:
>
> $xml selectNodesNamespaces {mp MarketParameters xc XmlCache}
That's the right way to bind prefixes to a namespace. One way. You can
always use the -namespaces option to the selectNodes method, but
setting things up with one selectNodesNamespaces call for the rest of
the lifetime of the document seems to be more convenient to me.
>I got some progress... But the namespaces are defined in the document itself
>-- for example:
>
> <xc:XmlCache xmlns
c="XmlCache" xc:action="Update">
>
>why do I still need to specify them? It certainly works with xml_grep... Is
>there a bug in the package (tDOM), or is the above element not sufficient
>to define a namespace?
No, it's not a bug. As long as no selectNodesNamespaces setting nor
the -namespaces option is given, tDOM even respects the XML namespace
declarations of the document. The context node of your XPath
expression is the node, from which you call your XPath expression. If
the (all) prefixes, you're using in your XPath expression are in scope
of that node, you've to do nothing; namespace resolving will work as
you expect. Since you had trouble with this, I'd bet, not all used
XML namespace declarations are in scope of your context node.
But, as others already have pointed out, it is _dangerous_ to bank on
the prefixes in the document. Prefixes don't matter, it's the
namespaces, that matters.
From the XML viewpoint,
<a:doc xmlns:a="http://foo.bar.com">
<a:elem>data</a:elem>
</a:doc>
and
<b:doc xmlns:b="http://foo.bar.com">
<b:elem>data</a:elem>
</b:doc>
are the in some sense the 'same' documents.
You can't just say [$someNode selectNodes a:elem] in your code and
expect that to work reliable. If the document provider uses another
prefix (bound to the same namespace), your code will fail.
The clear way out is, to say the XPath engine, which namespace you
mean with which prefix. With e.g. selectNodesNamespaces.
rolf