xsl-list
[Top] [All Lists]

RE: [xsl] Creating namespace declarations solely for QName attribute values

2008-10-16 17:53:51
Are you using XSLT 2.0? The xsl:namespace instruction was invented to make
this kind of job easier.

Michael Kay
http://www.saxonica.com/
 

-----Original Message-----
From: Jeff Greif [mailto:jeff(_dot_)greif(_at_)gmail(_dot_)com] 
Sent: 16 October 2008 22:45
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Creating namespace declarations solely for 
QName attribute values

We are trying to replace namespaces consistently in the 
namespace declarations of a document, thus preserving the 
prefixes so the QName attribute values remain valid.

That is, given a source document like this:

<schema targetNamespace="urn:target" xmlns:t="urn:target"
xmlns:i="urn:imported">
 <import namespace="urn:imported"/>
 <element name="something" type="i:ImportedType"/> </schema>

The key feature of this document is that no element or 
attribute in the document is in either of the explicitly 
declared namespaces.
These namespaces are only referenced explicitly in attribute 
values and implicitly in the QName-valued attribute 'type'.

The idea is to change urn:target to urn:target1 and urn:imported to
urn:imported1 (based on a map of these conversions read into 
the XSLT using the document() function).  None of the 
namespaces involved in this conversion can be declared in the 
stylesheet, but are determined from the map.

We know how to change the value of any attribute, the 
namespace of any element or attribute using this map, but we 
don't see yet how to change the association of a prefix with 
a namespace, so that the prefix 'i' will be associated with 
the namespace "urn:imported1" in the result document, 
effectively changing the namespace implied by the value of 
the 'type' attribute in the result document, *when there is 
no element or attribute in the source document that has the 
namespace corresponding to that prefix*.

We are trying to avoid having to know which are attributes 
with QName values and having to transform their values to 
somehow conform to prefixes used in the result doc.

Is there a way to do this in XSLT, given that matching on 
namespace nodes is not possible, and we have been unable to 
find a way to create namespace nodes in a template except by 
naming an element or attribute using the prefix in question?  
Would a solution involve creating an attribute with the given 
prefix and namespace, to change the namespace nodes of the 
containing element, while avoiding having the attribute 
appearing in the result document?

Jeff

--~------------------------------------------------------------------
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>
--~--