From: Birnbaum, D. J <dj...@pi...> - 2012-10-31 21:03:53
|
Dear Joe (cc eXist-list), > Namespace inheritance is a fact of life for XQuery. > See http://markmail.org/message/arcashs4vqcqnghv > and http://markmail.org/message/btycnoxvm3gwq7pz. > You'll learn to code around it. I thought of this, although apparently not thoroughly enough. I had tried: declare option exist:serialize "method=xhtml media-type=text/xml indent=yes"; let $plays := collection('/db/shakespeare/plays')/PLAY let $speakers := $plays//SPEAKER let $distinct-speakers := distinct-values($speakers) return <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Speakers who occur in multiple plays</title></head> <body> <h1>Speakers who occur in multiple plays</h1> <ul>{ for $i in $distinct-speakers where count($plays[.//SPEAKER = $i]) > 1 order by $i return <li>{concat($i, ": ", string-join(($plays[.//SPEAKER eq $i]/TITLE),"; "))}</li> }</ul> </body> </html> without success. I had thought that defining the XQuery variables outside the HTML namespace would do what I want, and that once I had built them in no namespace, I could use them inside the namespaced output. No soap. What does work is the more extreme strategy suggested at one of the examples you mention: declare option exist:serialize "method=xhtml media-type=text/xml indent=yes"; let $stuff := let $plays := collection('/db/shakespeare/plays')/PLAY let $speakers := $plays//SPEAKER let $distinct-speakers := distinct-values($speakers) for $i in $distinct-speakers where count($plays[.//SPEAKER = $i]) > 1 order by $i return <li>{concat($i, ": ", string-join(($plays[.//SPEAKER eq $i]/TITLE),"; "))}</li> return <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>Speakers who occur in multiple plays</title></head> <body> <h1>Speakers who occur in multiple plays</h1> <ul>{$stuff}</ul> </body> </html> I'm not sure I understand why I can define $stuff outside the HTML namespaced context and then use it inside that context without having a namespace inflicted on it, but I can't define, say, $plays outside the HTML namespace and then refer to that inside. Is the difference that in my earlier version, the one that didn't do what I wanted, although I had defined $plays outside the HTML namespace, it was actually a sequence of pointers, so when I used it inside the HTML namespace, the namespace was imposed on it before the pointers were traversed? That would seem to make sense insofar as in the new version, the one that works, $stuff is a an atomized string, and therefore not carrying any pointers into the document. As the precedings suggests (er ... shows), I'm making this up as I go along, trying to make sense of why I can safely define some variables outside the namespace and use them inside ($stuff), but not others ($plays). Is it the pointer-vs-copy distinction that makes them behave differently? That is, that $stuff contains text and $plays says "go look it up in the document, and you're only allowed to look in the namespace that is the default at the moment"? Thanks, David dj...@gm... |