XSL problem matching node containing xmlns attribute

C

clover2411

Hi there,

Apologies if I'm posting to the wrong group; this one looked to be the
best match.

I'm having trouble writing a bit of XSL/XPATH and wondered if someone
would please shed some light. My XML is generated by InfoPath and of
the structure:

....
<my:Alpha>
<my:Beta>
<my:Gamma>
<div xmlns="http://www.w3.org/1999/xhtml">one line of text</div>
<div xmlns="http://www.w3.org/1999/xhtml">another one</div>
</my:Gamma>
</my:Beta>
<my:Beta>
<my:Gamma>just the one line here
</my:Gamma>
</my:Beta>
</my:Alpha>
....

Note the my:Gamma node - sometimes it will contain divs separating
pieces of text, other times just text. In my XSL I'm trying to test
whether my:Gamma contains divs (if it does, then I can get value-of
div, otherwise I can just get value-of my:Gamma).

I'm trying to use the below construct:

<xsl:choose>
<xsl:when test="div">
...
</xsl:when>
<xsl:eek:therwise>
...
</xsl:eek:therwise>
</xsl:choose>

This works if I get rid of the xmlns="http://www.w3.org/1999/xhtml"
from the div tags, but I can't seem to write a valid test condition in
the xsl:when that will find the full <div
xmlns="http://www.w3.org/1999/xhtml"> tag. I thought <xsl:when
test="div[@*]"> might work but it doesn't seem to, leading me to think
that 'xmlns' isn't classified as an attribute as such. Maybe it's
blindingly obvious but I haven't been able to find an answer!

Many thanks in advance.
 
?

=?ISO-8859-1?Q?Une_B=E9vue?=

clover2411 said:
This works if I get rid of the xmlns="http://www.w3.org/1999/xhtml"
from the div tags, but I can't seem to write a valid test condition in
the xsl:when that will find the full <div
xmlns="http://www.w3.org/1999/xhtml"> tag. I thought <xsl:when
test="div[@*]"> might work but it doesn't seem to, leading me to think
that 'xmlns' isn't classified as an attribute as such. Maybe it's
blindingly obvious but I haven't been able to find an answer!

I think that's a question of name space

add to your <xsl:stylesheet version ...
the following :

xmlns:h="http://www.w3.org/1999/xhtml">

don't put xmlns="..." in your div tags.

but rather for example :

<xsl:when test="//h:div[@foo = 'bar]">
[...]

you'll have to prefix all xhtml element with h:
 
C

clover2411

Thanks very much for your replies, I've used the below suggestion which
works nicely (and put the namespace declaration on the xsl:stylesheet
element). Makes sense now I see it! :)
<xsl:when test="xhtml:div" xmlns:xhtml="http://www.w3.org/1999/xhtml">

Usually you will put the namespae declaration
xmlns:xhtml="http://www.w3.org/1999/xhtml" on the xsl:stylesheet element.

Not sure why InfoPath generates div tags with namespace declarations on
them in the middle of a form though, it'd be easier if it didn't!
 
A

Andy Dingley

clover2411 said:
Not sure why InfoPath generates div tags with namespace declarations on
them in the middle of a form though, it'd be easier if it didn't!

No, it will be _exactly_ as easy to work with them, however they
appear. It's fundamental to XML that these namespacing rules don't care
where the attribute appears, they just care what's in scope.

How you code your XSLT is a separate problem. IMHE, always place your
own namespaces on the XSLT root xsl:stylesheet element and always use
an explicit namespace prefix, not the default. Although it's
technically possible to do it the other way, it's not humanly possible
to understand the source.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,738
Latest member
TiffinyHol

Latest Threads

Top