Subject: Re: [xsl] "*|@*|text()" vs. "node()" From: Francis Norton <francis@xxxxxxxxxxx> Date: Thu, 04 Oct 2001 14:44:15 +0100 |
Hi Jörg, Jörg Heinicke wrote: > > I want to shorten/improve my XSL-code, but a problem occures. Until now I > had a stylesheet like the following: > > <xsl:template match="*|@*|text()"> > <xsl:copy> > <xsl:apply-templates select="*|@*|text()"/> > </xsl:copy> > </xsl:template> > Take a look at the XSLT spec for the "identity transform" (http://www.w3.org/TR/xslt.html#copying). Their identity transform uses <xsl:template match="@*|node()"> Then look under patterns and you find the XSLT definition of the node() test: node() matches any node other than an attribute node and the root node which is slightly confusing since the XPath spec defines it as: A node test node() is true for any node of any type whatsoever. So then maybe it isn't the match that's wrong, maybe it's the select - so look under attribute in XPath (http://www.w3.org/TR/1999/REC-xpath-19991116#attribute-nodes) Each element node has an associated set of attribute nodes; the element is the parent of each of these attribute nodes; however, an attribute node is not a child of its parent element. So <xsl:apply-templates select="node()"/> is short for <xsl:apply-templates select="child::node()"/>, and attributes aren't on the child axis of their parent element. So you should be able to re-write the XSLT identity transform as <xsl:template match="node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> but that *doesn't* work - it drops attributes - so I guess the XSLT definition of node() applies rather than the XPath one. Francis. XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] "*|@*|text()" vs. "node(), Jörg Heinicke | Thread | RE: [xsl] "*|@*|text()" vs. "node(), Michael Kay |
Re: [xsl] questions., Jörg Heinicke | Date | [xsl] Re: Re: XSLT Tree Model, Dimitre Novatchev |
Month |