This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: XML source with DOCTYPE declaration
Hi Zeljko,
> So what am I doing wrong? Or did I maybe misunderstand you and I
> have to do the complete transformation in 2 separate steps:
>
> 1. Doing the preprocessing and save the output temporary
> 2. Using this temporary ouput (file) as source for the intended
> transformation
Yes - that's what I meant - two separate processes. You *could* do it
in the same stylesheet, if you're prepared to use a node-set()
extension function. So you could have a stylesheet like:
<xsl:template match="/">
<xsl:choose>
<!-- when the html document element isn't in the XHTML
namespace -->
<xsl:when test="not(html:html)">
<!-- apply templates in preprocess mode to get the namespaced
input -->
<xsl:variable name="preprocessed">
<xsl:apply-templates mode="preprocess" />
</xsl:variable>
<xsl:apply-templates select="exsl:node-set($preprocessed)/*" />
</xsl:when>
<!-- otherwise just apply templates -->
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="*" mode="preprocess">
<xsl:element name="{local-name()}"
namespace="http://www.w3.org/1999/xhtml">
<xsl:copy-of select="@*"/>
<!-- continue processing in 'preprocess' mode -->
<xsl:apply-templates mode="preprocess" />
</xsl:element>
</xsl:template>
<xsl:template match="html:html">
<xsl:text>html element found !!!</xsl:text>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="html:body">
<xsl:text>body element found !!!</xsl:text>
<xsl:apply-templates/>
</xsl:template>
Note that the namespace you use for the node-set() extension function
in the root-node-matching template is determined by the processor that
you're using. For example, using Xalan then you actually need:
lxslt:nodeset()
rather than exsl:node-set()
I hope that helps,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list