[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Copying Namespace Nodes

Subject: Re: Copying Namespace Nodes
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Sun, 27 Nov 2011 16:43:58 -0500
Re:  Copying Namespace Nodes
At 2011-11-27 22:10 +0100, Heiko Niemann wrote:
I have an element I want to copy and in the source it looks like this:

<a:elem
  xmlns:a="example.com/ns/a"
  xsi:type="nsc:foo"
  xmlns:nsc="example.com/ns/sensitive"
  xmlns:b="example.com/ns/b"
  xmlns:c="example.com/ns/c"
  ...
  xmlns:z="example.com/ns/z">info</a:elem>

What I want to achieve at the same time:

1) Keep the namespace declaration for the namespace sensitive content of
the xsi:type attribute (with prefix nsc).

2) Get rid of all namespace declarations that are not needed here (prefix
b, c, ..., z) and that clutter up my result document.

If I use copy-of with copy-namespaces set to 'no' the declaration for
namespace sensitive content will be lost. If I say 'yes' everything stays
the same. So is there a short way I have not seen yet or is the solution
some verbose template? :)

I don't think the template needed is very verbose at all since you are limiting yourself to finding the one prefix that is found in the xsi:type= attribute:


T:\ftemp>type heiko.xml
<?xml version="1.0" encoding="UTF-8"?>
<a:elem
xmlns:a="example.com/ns/a"
xsi:type="nsc:foo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:nsc="example.com/ns/sensitive"
xmlns:b="example.com/ns/b"
xmlns:c="example.com/ns/c"
xmlns:z="example.com/ns/z">info</a:elem>
T:\ftemp>xslt2 heiko.xml heiko.xsl
<?xml version="1.0" encoding="UTF-8"?><a:elem xmlns:a="example.com/ns/a" xmlns:nsc="example.com/ns/sensitive" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="nsc:foo"/>
T:\ftemp>type heiko.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.0">


<xsl:template match="*">
  <xsl:copy copy-namespaces="no">
    <xsl:for-each select="@xsi:type">
      <xsl:copy-of
          select="../namespace::*[name(.)=substring-before(current(),':')]"/>
      <xsl:copy/>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>

I hope this helps. If there is no xsi:type attribute, then no copy of the namespace node is done.

. . . . . . . . Ken

Thanks for help,
Heiko


--
Contact us for world-wide XML consulting and instructor-led training
Free 5-hour video lecture: XSLT/XPath 1.0 & 2.0 http://ude.my/t37DVX
Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/s/
G. Ken Holman                   mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.