Subject: RE: [xsl] A non self closed xsl:apply-templates element to create a text node for matching ... From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 5 Dec 2006 03:40:21 -0000 |
It's not legal to have an xsl:value-of element as a child of xsl:apply-templates, and I'm really not sure what you would expect it to mean. I can't see the difficulty in having a single template rule that matches both text nodes and attribute nodes, for example <xsl:template match="text() | @*"> perhaps with appropriate filters and/or a special mode. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: iwantto keepanon [mailto:iwanttokeepanon@xxxxxxxx] > Sent: 05 December 2006 03:08 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] A non self closed xsl:apply-templates element > to create a text node for matching ... > > > > > Using XSL 1.0 and xsltproc (Using libxml 20626, libxslt > 10117 and libexslt 813). > > I have a gallery XML file that I want to transform into an > Atom and a RSS feed. The XML "setup" file contains relative > URLs. I need a rule to transform text node and attribute > nodes to absolute URLs. But coding 2 seperate templates is > kind of dumb. So I tried to have the attribute rules (@*) > re-use the text (text()) rules. > > The only problem is that I have never seen this approach and > I cannot find the syntax in the specs. I have the shortest > XML and XSL code that represents what I am doing below. > > And my question is, is this "legal". Note the > "non-self-closed" apply-templates in the match="@*[...]". I > guess I am creating a text node at runtime and matching that. > I tried self::text() but, in attribute context, I dont think > that means anything. Is there a better way to take attribute > text and match it into another rule? > > (sorry if this is obtuse, hopefully the code helps) ... > > > test.xml: > <?xml version="1.0" encoding="utf-8"?> > > <top> > <img src="../Russia2006/photos/img.jpg"/> > </top> > > > test.xsl: > <?xml version="1.0" encoding="utf-8" standalone="yes"?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:output method="xml" version="1.0" omit-xml-declaration="no" > standalone="yes" encoding="utf-8" indent="yes" /> > > <xsl:template match="/"> > <elem> > <xsl:apply-templates /> > </elem> > </xsl:template> > > <xsl:template match="*"> > <xsl:copy><xsl:apply-templates select="@*|node()" > /></xsl:copy> </xsl:template> > > <xsl:template match="text()[ starts-with( ., '../Russia2006/' ) ]"> > <xsl:text>http://site.com/gallery/Russia/2006/</xsl:text> > <xsl:value-of select="substring-after( ., '../Russia2006/' > )" /> </xsl:template> > > <xsl:template match="@*"> > <xsl:copy><xsl:value-of select="." /></xsl:copy> </xsl:template> > > <!-- Match relative gallery image URLs only --> <xsl:template > match="@*[ > ( self::src or self::href ) and > ( '' != substring-before( ., '.jpg' ) or ( '' != > substring-before( ., '.gif' > ) ) ) ]"> > > <xsl:attribute name="{local-name()}"> > <!-- Tried, but does not work ... --> > <!-- xsl:apply-templates select="." / --> > <!-- xsl:apply-templates select="text()" / --> > <!-- xsl:apply-templates select="self::text()" / --> > > <!-- Does work ... creates a runtime text node? --> > <!-- Cross processor? --> > <xsl:apply-templates> > <xsl:value-of select="." /> > </xsl:apply-templates> > </xsl:attribute> > > </xsl:template> > > </xsl:stylesheet> > > > If this is really "leagle" and not just a "feature" of > xlstproc, then great! If not, help please. > > -- > Rodman
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] A non self closed xsl:apply-t, iwantto keepanon | Thread | [xsl] French Char display problem i, Senthilkumaravelan K |
[xsl] A non self closed xsl:apply-t, iwantto keepanon | Date | [xsl] French Char display problem i, Senthilkumaravelan K |
Month |