Re: [xsl] How to remove unnecessary "xmlns:xx" attributes?

Subject: Re: [xsl] How to remove unnecessary "xmlns:xx" attributes?
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Tue, 09 Nov 2010 18:07:36 -0500

I assume we are talking about a stylesheet that would copy all the input except any namespaces that are not actually used, giving a result document in which they were not declared.

This is easier to do in XSLT 2.0 than in XSLT 1.0. If you need an XSLT 1.0 solution you should say so.

In XSLT 2.0, this could be accomplished by an stylesheet with an identity template set with copy-namespaces="no", and a template matching the document node (top-level element) that would reach into the document, group its elements and attributes by their namespace (the one actually used), and copy a namespace node for each group to the document element.

The result would be a document in which each of the namespaces actually used would be declared at the top level.

Unfortunately I don't have time at the moment to mock this up for you, but it shouldn't be all that hard, given facilities in XSLT 2.0 (for grouping) and XPath 2.0 (namespace-uri() and friends, for determining namespaces used in names).

Keep in mind that additional complications could arise if you ever have clashing namespaces (same namespace and different prefix or same prefix different namespace). Hopefully you don't.


At 01:58 PM 11/9/2010, you wrote:
I currently have an ad hoc Soap client framework that uses JAXB to
marshal a Soap request.  This generates a "minimal" Soap envelope, in
that it contains a "xmlns:xx" attribute for every "xx" that is actually
referenced in the request.

The WSDL that defines this request references numerous schemas, and
defines all the possible operations for this service.

I'm now doing an experiment to see if I can replace our ad hoc Soap
client framework with Apache CXF.  My results so far are ok, but I
noticed that the request that is built now contains "xmlns:xx"
attributes for EVERY schema referenced in the WSDL, even if that
namespace isn't referenced in the request.  As a result, my requests are
now 20 times larger.

I'm examining whether it's possible to get back to what I had before,
although with the new framework, but I think it may not be practical.
I'm not even sure the resulting larger request will result in any
increased latency.  It might make no difference, from a performance
point of view.

However, these requests are occasionally saved and passed back and forth
in email, to discuss certain operational issues.  It would be ideal if
these requests are "minimal".  If I can't solve this problem at runtime,
I'd at least like to have an XSLT stylesheet that can "minimize" the
request by simply removing the "xmlns:xx" attributes where the namespace
referred to by the "xx" prefix is not referenced in the request.  I've
googled about this, but I haven't found a clear solution for this.  Does
someone have an idea how I would write a stylesheet to do this?

Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.      
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
  Mulberry Technologies: A Consultancy Specializing in SGML and XML

Current Thread