Hello,
in this example I have an order with different typed items. The type is a
QName in an attribute. There are namespaces declared, having the same
prefix as the 'prefix' in the xsi:type attribute. As you can see there are
more namespaces declared as needed (whatever the reason for that case
might be). Now I would like to clean up and just keep the ones that are
'used' in the xsi:type content. The stylesheet actually already does what
I want, but I would like to know whether there might be a better way to do
it, since it looks a little hackish to me.
Thanks,
Heiko
---------
SOURCE
---------
<?xml version="1.0" encoding="UTF-8"?>
<c:order xmlns:c="http://prods.com/c"
xmlns:v="http://prods.com/v"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<v:item xsi:type="ns1:basicItem"
xmlns:ns1="http://prods.com/ns1"
xmlns:ns2="http://prods.com/ns2"
xmlns:ns3="http://prods.com/ns3">
<v:name>Basic</v:name>
<v:number>A200338</v:number>
<v:color>blue</v:color>
</v:item>
<v:item xsi:type="ns2:advancedItem"
xmlns:ns1="http://prods.com/ns1"
xmlns:ns2="http://prods.com/ns2"
xmlns:ns3="http://prods.com/ns3">
<v:name>Advanced</v:name>
<v:number>A200339</v:number>
<v:color>white</v:color>
<v:pattern>stripes</v:pattern>
</v:item>
<v:item xsi:type="ns4:lostItem"
xmlns:ns1="http://prods.com/ns1"
xmlns:ns2="http://prods.com/ns2"
xmlns:ns3="http://prods.com/ns3">
<v:name>Lost</v:name>
<v:number>A200340</v:number>
</v:item>
</c:order>
----------------
STYLESHEET
----------------
<?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:output method="xml" encoding="UTF-8"/>
<!--identity transformation; copy namespaces-->
<xsl:template match="*">
<xsl:copy copy-namespaces="yes">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!--identity tranformation; do not copy namespaces; create namespace of
xsi:type-->
<xsl:template match="*[@xsi:type]">
<xsl:variable name="var.prefix"
select="substring-before(@xsi:type,':')"/>
<xsl:copy copy-namespaces="no">
<xsl:copy-of select="@*"/>
<xsl:if test="namespace-uri-for-prefix($var.prefix,.)">
<xsl:namespace name="{$var.prefix}"
select="namespace-uri-for-prefix($var.prefix,.)"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<!--identity transformation; do not copy namespaces-->
<xsl:template match="*[@xsi:type]//*">
<xsl:copy copy-namespaces="no">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
-------------
RESULT
-------------
<?xml version="1.0" encoding="UTF-8"?>
<c:order xmlns:c="http://prods.com/c"
xmlns:v="http://prods.com/v"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<v:item xsi:type="ns1:basicItem" xmlns:ns1="http://prods.com/ns1">
<v:name>Basic</v:name>
<v:number>A200338</v:number>
<v:color>blue</v:color>
</v:item>
<v:item xsi:type="ns2:advancedItem" xmlns:ns2="http://prods.com/ns2">
<v:name>Advanced</v:name>
<v:number>A200339</v:number>
<v:color>white</v:color>
<v:pattern>stripes</v:pattern>
</v:item>
<v:item xsi:type="ns4:lostItem">
<v:name>Lost</v:name>
<v:number>A200340</v:number>
</v:item>
</c:order>
--~------------------------------------------------------------------
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>
--~--