Subject: [xsl] RTF variables, node-set and namespaces From: "cking" <cking@xxxxxxxxxx> Date: Mon, 6 Sep 2004 13:05:00 +0200 |
Hi y'all There's something about node-sets I fail to understand. Say, I have a variable holding a result tree fragment: <xsl:variable name="rtf-words"> <word>one</word> <word>two</word> <word>three</word> </xsl:variable> Suppose I want to access the second <word> element: select="exsl:node-set($rtf-words)/word[2]". That works fine as long as the stylesheet output is 'simple' xml. But when I try this in an xhtml-output stylesheet, it doesn't work anymore. Test stylesheet: (used against any xml doc) <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl" > <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" /> <xsl:variable name="rtf-words"> <word>one</word> <word>two</word> <word>three</word> </xsl:variable> <xsl:variable name="rtf-ul"> <ul xmlns="http://www.w3.org/1999/xhtml"> <li>one</li> <li>two</li> <li>three</li> </ul> </xsl:variable> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>test node-set</title></head> <body> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match="/*"> <ul><xsl:apply-templates select="exsl:node-set($rtf-words)/word" mode="li"/></ul> <ul><xsl:apply-templates select="exsl:node-set($rtf-ul)/ul/li" mode="li"/></ul> </xsl:template> <xsl:template match="*" mode="li"> <li><xsl:value-of select="."/></li> </xsl:template> </xsl:stylesheet> Output: (saxon 6.5.3) <ul/> <ul/> Expected output: <ul><li>one</li><li>two</li><li>three</li></ul> <ul><li>one</li><li>two</li><li>three</li></ul> The easiest way to solve this, is using "*" instead of the element names, like select="exsl:node-set($rtf-words)/*" select="exsl:node-set($rtf-ul)/*/*" That works, and in most cases it's OK to use "*" because the element names don't really matter, but I can't understand why: select="exsl:node-set($rtf-words)/word" and select="exsl:node-set($rtf-words)/*[self::word]" don't work, but select="exsl:node-set($rtf-words)/*[name()='word']" does. It must have something to do with namespaces, because I found out that adding xmlns="" also helps: <xsl:variable name="rtf-words"> <word xmlns="">one</word> <word xmlns="">two</word> <word xmlns="">three</word> </xsl:variable> <xsl:variable name="rtf-ul"> <ul xmlns=""> <li>one</li> <li>two</li> <li>three</li> </ul> </xsl:variable> That does give the expected output. But it puzzles me because I would think esp. the <ul> element *should* be in xmlns="http://www.w3.org/1999/xhtml" It also puzzles me that apparently, [self::word] is not the same as [name()='word'] Any thoughts? Anton Triest
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] docbook: xref to generic elem, Bernd Kuemmerlen | Thread | Re: [xsl] RTF variables, node-set a, David Carlisle |
RE: [xsl] how to generate a xsl fro, Michael Kay | Date | Re: [xsl] RTF variables, node-set a, David Carlisle |
Month |