xsl-list
[Top] [All Lists]

RE: Namespace problem

2004-09-13 14:48:33
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(_at_)opnet(_dot_)com] 
Sent: 13 September 2004 22:36
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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

--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--


--+------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--




<Prev in Thread] Current Thread [Next in Thread>