[Haskell-cafe] Re: HXT Namespaces and XPath
Mads Lindstrøm
mads_lindstroem at yahoo.dk
Tue Apr 6 14:34:24 EDT 2010
Hi Uwe
I read your reply multiple times, but I am still confused. I think
either I misunderstand you or I did not explain myself properly in the
first mail.
> Hi Mads,
>
> > In HXT, namespace prefixes bound by an XML document are valid in the
> > context of an XPath. How do avoid that?
> >
> > An example program will clarify:
> >
> > simpleXml :: String
> > simpleXml = "<soap:Body xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"/>"
> >
> > nsEnv :: [(String, String)]
> > nsEnv = [ ("s" , "http://www.w3.org/2003/05/soap-envelope") ]
> >
> > evalXPath :: String -> String -> [XmlTree]
> > evalXPath xpath xml =
> > runLA ( xread
> > >>> propagateNamespaces
> > >>> getXPathTreesWithNsEnv nsEnv xpath
> > ) xml
> >
> > Here:
> >
> > evalXPath "//s:Body" simpleXml ==
> > evalXPath "//soap:Body" simpleXml
> >
> > Even though I only mentions the prefix "s" (and not "soap") in the
> > function nsEnv.
>
> When working with namespaces in XML, the prefixes are not longer significant.
> After namespace propagation every name in the XML document is identified
> by a qualified name. This is a pair consisting of the namespace URI and the local part.
> The prefixes become irrelevant.
This is my point. Prefixes are relevant in the current implementation of
HXT.
> A namespace aware XPath expression needs a namespace environment,
> as given in the example, to construct these qualified names for the names
> in the XPath expression.
> So the results of both evalXPath calls in your example must be the same.
Yes, but in the namespace environment I give to getXPathTreesWithNsEnv I
only mention the prefix s, yet I am still able to evaluate the xpath
"//soap:Body". Furthermore "//s:body" and "//soap:Body" gives the same
results. Why?
I think another example will clarify my point. The code:
simpleXmlOne, simpleXmlTwo :: String
simpleXmlOne = "<a:Foo xmlns:a=\"http://foo.org\"/>"
simpleXmlTwo = "<b:Foo xmlns:b=\"http://foo.org\"/>"
nsEnv :: [(String, String)]
nsEnv = [ ("notFoo" , "http://notfoo.org") ]
evalXPath :: String -> [XmlTree]
evalXPath xml =
runLA ( xread
>>> propagateNamespaces
>>> getXPathTreesWithNsEnv nsEnv "//a:Foo"
) xml
Now notice that simpleXmlOne and simpleXmlTwo are equivalent. Yes, they
have a different prefix for "http://foo.org", but the documents means
the same. And as you write yourself, "... the prefix is no longer
releavant ..." Yet:
evalXPath simpleXmlOne /= evalXPath simpleXmlTwo
Hope that clarifies things.
Regards,
Mads
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20100406/92776545/attachment.bin
More information about the Haskell-Cafe
mailing list