[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] How to stop xalan from deleting namespace declarations


Subject: RE: [xsl] How to stop xalan from deleting namespace declarations
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Wed, 11 Jun 2003 15:10:13 +0100

A classic example of the problem that namespace prefixes don't matter,
except when they do.

The rules for xsl:namespace-alias don't say what namespace prefix should
be used in the result tree. This makes it difficult to reliably use a
namespace prefix within the content of the result document, as in your
example system-property('xsl:version').

You may be better off not using xsl:namespace-alias at all. I find it
more straightforward to write:

<xsl:element name="xsl:stylesheet">

etc., and this way you're more likely to get the prefix you want, though
it's still not guaranteed.

Using <xsl:element> to generate just the outermost (xsl:stylesheet)
element may be enough to force the processor to output a namespace
declaration for the desired prefix.

You can force the result tree to contain a particular namespace
declaration in XSLT 2.0 by using xsl:namespace, or in 1.0 by copying a
namespace node from another document. 

Michael Kay


> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> Peter Janker
> Sent: 11 June 2003 08:00
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] How to stop xalan from deleting namespace declarations
> 
> 
> 
> Hello All,
> 
> I  try to write an  xslt-script that outputs an xslt-script. 
> Saxon (6.5.2) and MSXSL(3) seem to work but I have difficulties with 
> the namespace handling within xalan (2_5_0).
> Therefore I have three related questions concerning xalan(2-5-0) and 
> the handling of namespace declarations.
> 
> 1: How can I prevent xalan from deleting its own namespace 
> prefix declaration?
> 2: How can I prevent xalan from deleting a second namespace prefix 
> declaration for a given namespace?
> 3: How can I force xalan to explicitely write a namespace declaration 
> within a tag in the output script?
> (like: <out:apply-templates xmlns:xalan="http://xml.apache.org/xalan" 
> select="xalan:nodeset($Var)"/> )
> 
> Details:
> 
> The command
> <xsl:namespace-alias stylesheet-prefix="out" 
> result-prefix="xsl"/> is used to set the prefix in the output 
> script. (Saxon and msxsl replace the prefix, xalan uses the 
> prefix 'out' and 
> replaces the URL.)
> 
> To handle tree fragments in different environments I want to 
> know the vendor:
> 
> <out:variable name="Vendor" select="system-property('xsl:vendor')" />
> 
> 'xsl' because within the single quotes ('') the prefix is not 
> replaced.
> 
> Because of the URI-replacement xalan does not know the xsl 
> prefix. I thought a workaround would be to declare the 
> namespace either for 
> both prefixes or within the variable tag: 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:out="http://www.w3.org/1999/XSL/Transform"
> <out:variable name="Vendor" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> select="system-property('xsl:vendor')" />
> 
> <out:apply-templates xmlns:xalan="http://xml.apache.org/xalan" 
> select="xalan:nodeset($Var)"/>
> 
> Unfortunately xalan is always deleting one of the declarations and 
> omittes the inline declaration.
> Furthermore xalan is always deleting its own namespace-prefix 
> declaration (xmlns:xalan="http://xml.apache.org/xalan" ) from the 
> stylesheet-tag and therefore the following lines
> in the output script do not work because of an unknown prefix 'xalan'.
> 
> <out:choose>
> ....
>     <out:when test="contains($Vendor, 'Apache') ">
>         <out:apply-templates select="xalan:nodeset($Var)"/>
>     </out:when>
> ....
> </out:choose>
> 
> 
> The transformation is started by a batch file with one line: 
> java -classpath 
> .;D:\jdk1.3.1_04\lib\tools.jar;D:\Xalan\xalan-j_2_5_0\bin\xala
> n.jar;D:\Xalan\xalan-j_2_5_0\bin\xml-apis.jar;D:\Xalan\xalan-j
> _2_5_0\bin\xercesImpl.jar 
> org.apache.xalan.xslt.Process -in m2t.xml -xsl m2t.xsl -out 
> xalan_m2T_out.xsl
> 
> The generated script xalan_m2T_out.xsl works if one adds the two by 
> xalan omitted declarations.
> 
> Thank you for your help.
> 
> 
> Peter
> 
> -- 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords