XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Zach SSubject: Using XSLT to transform XML to qualified XML
Author: Zach S
Date: 12 Mar 2009 04:56 PM
To anyone who can help,

My issue is that I have just finish redoing an XML Schema, in which I have taken a schema that was all in one file and separated it into multiple schema documents that call one another by way of <import>. The original (one document schema) was a no-namespace schema. In order to provide the hierarchy I needed I had to use namespaces in the new schema with the <import> ability.

The issue here is that I have a ton of test files that use the no-namespace schema, and I was hoping to write an XSLT file to transform these test XML files from having elements with no namespace prefixes to elements with proper namespace prefixes. That is all I want to change, I want everything else to remain the same and to be ported over into the new XML test documents.

For example:

current XML test document:
<EMP>
<PropCalc>
<SectorJob>
<StartPoint x="90" y="30"/>
<Antenna>
<Dipole gain="30"/>
</Antenna>
</SectorJob>
</PropCalc>
</EMP>

new XML test document (what I need it to look like after the XSLT transformation):
<EMP>
<prop:PropCalc>
<prop:SectorJob>
<util:StartPoint x="90" y="30"/>
<ant:Antenna>
<ant:Dipole gain="30"/>
</ant:Antenna>
</prop:SectorJob>
</prop:PropCalc>
</EMP>

XSLT I have tried:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="/">
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="PropCalc">
<prop:PropCalc>
<xsl:apply-templates select="@* | node()"/>
</prop:PropCalc>
</xsl:template>
<xsl:template match="SectorJob">
<prop:SectorJob>
<xsl:apply-templates select="@* | node()"/>
</prop:SectorJob>
</xsl:template>
<xsl:template match="StartPoint">
<util:StartPoint>
<xsl:apply-templates select="@* | node()"/>
</util:StartPoint>
</xsl:template>
<xsl:template match="Antenna">
<ant:Antenna>
<xsl:apply-templates select="@* | node()"/>
</ant:Antenna>
</xsl:template>
<xsl:template match="Dipole">
<ant:Dipole>
<xsl:apply-templates select="@* | node()"/>
</ant:Dipole>
</xsl:template>
</xsl:stylesheet>

I have also tried declaring the prop, ant, and util namespaces in the <xsl:stylesheet> element and used exclude-result-prefixes to try and get the xmlns attributes to not appear - this didn't work.

The problem is that my output document has the xmlns:*="*" attribute declared for each element in the new XML test document. I don't want this because I plan on globally declaring all namespaces in the XML test document and want the prefixes put in place to reference these global namespace declarations.

Thanks in advance for your time and help.

Postnext
John BamptonSubject: Using XSLT to transform XML to qualified XML
Author: John Bampton
Date: 13 Mar 2009 06:34 AM
XSLT output will always be namespace-well-formed. If an element in the result tree uses the prop: prefix, then the result tree will contain a declaration of that prefix. There is no way of switching this off, any more than you could generate an end tag that doesn't match the corresponding start tag

Cheers, John Bampton.

Postnext
Zach SSubject: Using XSLT to transform XML to qualified XML
Author: Zach S
Date: 13 Mar 2009 09:53 AM
Thats what I was afraid of. Thanks.

Posttop
Zach SSubject: Using XSLT to transform XML to qualified XML
Author: Zach S
Date: 13 Mar 2009 01:01 PM
So, I found a solution to my "unsolvable problem" that I thought I would post here in case anyone else had the same problem I did.

Inside the <xsl:stylesheet> element declare the namespaces to be used. The idea is then to get these namespaces to be declared inside the root element of the XSLT output document. Upon doing so all the elements that are children of the root element (everything) XSLT will not need to declare their respective namespaces explicitly.

To get the namespaces declared inside <xsl:stylesheet> to show up in the root element of the output XML document use the following code:

<xsl:template match="/*">
<xsl:element name="{local name of root element}">
<xsl:copy-of select="document('')/xsl:stylesheet/namespace::*[name() != 'xsl']"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>


I believe this essential creates a new root element with the namespaces added, but as long as the local name of the root element stays the same, nothing has changed from the input XML to the output XML (with the obvious exception of the added namespaces).

I hope this helps anyone who happens to have the same problem I did. Enjoy.

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.