RE: [xsl] Namespace problem

Subject: RE: [xsl] Namespace problem
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 13 Sep 2004 22:48:33 +0100
My reading of Dave's response was that in Xalan-C the namespace axis does
return all in-scope namespaces, but that you cannot reliably obtain the
parent element of a namespace node. So rather than accessing the parent of
the namespace node using the parent axis, you need to save it (the parent
element) in a variable. Is that correct?

Michael Kay

> -----Original Message-----
> From: Marc Schneider [mailto:mschneider@xxxxxxxxx] 
> Sent: 13 September 2004 22:36
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Namespace problem
> 
> Dave -
> 
> Since WSDL files have QName in attributes, the namespace 
> prefix in the 
> attribute can be any in-scope namespace. This deviation from 
> the XPath data 
> model makes it very difficult to process WSDL files.
> 
> Marc
> 
> At 04:27 PM 9/13/2004, you wrote:
> > > Hello -
> > >
> > > I may have spoken too soon when I said that using 
> current() did the
> >trick.
> > > This apparently works in XalanJ, but XalanC v1.7 appears to have a
> >problem
> > > with namespace::* and doesn't evaluate 
> namespace::*[starts-with(name(),
> > > substring-before(current()/parent::node()/@name,':'))] correctly.
> > >
> > > Unfortunately, I need to support XalanC v1.7, does anyone 
> know of a way
> >to
> > > resolve a namespace URI from the prefix in XalanC 1.7?
> >
> >This is a case where Xalan-C deviates from the XPath data 
> model, and does
> >not have a namespace node for every in-scope namespace on 
> every element.
> >The following stylesheet produces the desired result:
> >
> ><?xml version="1.0"?>
> ><xsl:stylesheet
> >     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
> >         xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
> >         version="1.0">
> >
> ><xsl:output encoding="utf-8" />
> >
> ><xsl:template match="wsdl:operation">
> >   <xsl:element name="operation">
> >     <xsl:choose>
> >       <xsl:when test="contains(parent::node()/@name,':')">
> >           <xsl:variable name="ns"
> >select="substring-before(parent::node()/@name, ':')" />
> >         <xsl:attribute name="portType_nspc">
> >           <xsl:choose>
> >             <xsl:when test="contains(parent::node()/@name,':')">
> >               <xsl:value-of select="namespace::*[name() = $ns]"/>
> >             </xsl:when>
> >             <xsl:otherwise>
> >               <xsl:value-of
> >select="ancestor::*[last()]/@targetNamespace"/>
> >             </xsl:otherwise>
> >           </xsl:choose>
> >         </xsl:attribute>
> >       </xsl:when>
> >       <xsl:otherwise>
> >         <xsl:attribute name="portType_nspc"/>
> >       </xsl:otherwise>
> >     </xsl:choose>
> >   </xsl:element>
> ></xsl:template>
> >
> ></xsl:stylesheet>
> >
> >I've been tempted numerous times to fix this deviation, but the cases
> >where this has caused a problem have been extremely rare, 
> and the cost in
> >memory overhead is considerable in many cases.
> >
> >Dave

Current Thread