At 2008-12-12 12:20 -0800, Fred Christian wrote:
I continue to have problems getting my brain to understand how to
handle namespace problems. I think I have broken one down simple
enough to get help on. (Using Saxon 9)
Basically I have this xsl:
<xsl:for-each select="child::*[1]">
3)<xsl:value-of select="name(.)"/>#
</xsl:for-each>
<xsl:for-each select="div">
4)<xsl:value-of select="name(.)"/>#
</xsl:for-each>
and this output:
3)div#
---
The problem, there is no "4)div#"
I realize it is because of a namespace problem, but I don't know how
to solve it. Help?
Unprefixed names in XPath by default are names in no namespace, not
names in the default namespace. You've declared the XHTML to be the
default namespace.
1. Is there a way that I can write some xsl, that will give me
temporary output so I can figure out what I need to add to my xsl so
that "4)div#" will work without looking at the xml? (I ask this,
because sometimes the xml I am working with is huge and it is easy
to get lost).
2. Following are the files I am using, stripped down as much as I
dared. How can I modify my XSL so the "4)div#" works with a direct
select statement instead of *[1]? (because it won't always be in
the first position)
Two mutually exclusive solutions: (1) associate the XHTML namespace
with a prefix and use the prefix in your select, or (2) declare the
default XPath namespace as the XHTML namespace (because you are using
XSLT 2 and not XSLT 1).
But I just realized that (2) is not available to you because your XML
element names are in no namespace and you need to match those, so you
are stuck with (1).
________ XSL file ____________________
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="xsl">
...
<xsl:for-each select="div">
4)<xsl:value-of select="name(.)"/>#
Change that as follows:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
<xsl:for-each select="h:div">
4)<xsl:value-of select="name(.)"/>#
If solution (2) were available to you it would look like the following:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.w3.org/1999/xhtml">
...
<xsl:for-each select="div">
4)<xsl:value-of select="name(.)"/>#
.... but it would interfere with your match= of the no-namespace
elements in your XML file, so this approach is not easily available
to you. It is available to you if you declare
xpath-default-namespace= in multiple places in your stylesheet, but
that gets awkward.
Note in both cases you do not need to exclude the XSLT namespace as
that is implicit.
I hope this helps.
. . . . . . . . . Ken
--
Upcoming XSLT/XSL-FO, UBL and code list hands-on training classes:
: Sydney, AU 2009-01/02; Brussels, BE 2009-03; Prague, CZ 2009-03
Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
Video sample lesson: http://www.youtube.com/watch?v=PrNjJCh7Ppg
Video course overview: http://www.youtube.com/watch?v=VTiodiij6gE
G. Ken Holman mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/
Male Cancer Awareness Nov'07 http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers: http://www.CraneSoftwrights.com/legal
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--