replace namespace from source xml
i have searched but i couldn't find appropriate solution for handling namespace in xslt 1.0. Each node has many attributes but for easy readability i haven't shown them.
My input xml
<?xml version="1.0" encoding="UTF-8"?>
<Vendor VendorId="v1" VendorName="vaseline health" xmlns:ns1="http://ABCSampleDemo.SampleDemo" >
<Customer CustId="c1" CustomerName="John Dillon" CustomerAddress="3093 jerfe st" Code="APL111">
<POrders PId="P0110" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0111" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="09-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" />
<ID AuthId= "1111"/>
<POrders PId="P0112" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="09-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" />
<ID AuthId= "1111"/>
<POrders PId="P0113" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0114" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0115" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0116" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0117" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P0118" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
</Customer>
<Customer CustId="C2" CustomerName="Mac Payne" CustomerAddress="3333 jerfe st" Code="APL113">
<POrders PId="P2221" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="01-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P2222" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="01-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" />
<ID AuthId= "1111"/>
<POrders PId="P2223" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T000" PurchaseStart="01-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" />
<ID AuthId= "1111"/>
<POrders PId="P2224" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="01-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
<POrders PId="P2225" PName="uuu aillw" Units="3" Amount="100" ServiceRef="T001" PurchaseStart="01-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" />
<ID AuthId= "1111"/>
</Customer>
</Vendor>
CURRENT SS,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name=" KPOrderAttrb" use="concat(@ServiceRef,'+',@WarehouseId,'+',substring(@PurchaseStart,1,10))" match="POrders"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each select="Customer">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:attribute name="ClientSeqNo"><xsl:number count="Customer"/></xsl:attribute>
<xsl:for-each select="descendant::POrders[generate-id() = generate-id(key('KPOrderAttrb', concat(@ServiceRef,'+',@WarehouseId,'+',substring(@PurchaseStart,1,10))) [1] )]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:variable name="vGroup" select="key('KPOrderAttrb',concat(@ServiceRef,'+',@WarehouseId,'+',substring(@PurchaseStart,1,10)))"/>
<xsl:v开发者_Go百科ariable name="vPOrderIds">
<xsl:for-each select="$vGroup">
<xsl:sort select="@PId" data-type="number"/>
<xsl:if test="not(position()=1)">
<xsl:value-of select="','"/>
</xsl:if>
<xsl:value-of select="@PId"/>
</xsl:for-each>
</xsl:variable>
<xsl:attribute name="index"><xsl:value-of select="position()"/></xsl:attribute>
<xsl:attribute name="Code"><xsl:value-of select="ancestor::Customer[1]/@Code"/></xsl:attribute>
<xsl:attribute name="AuthId"><xsl:value-of select="descendant::ID[1]/@AuthId"/></xsl:attribute>
<xsl:attribute name="CombinePOID"><xsl:value-of select="$vPOrderIds"/></xsl:attribute>
<xsl:attribute name="Amount"><xsl:value-of select="sum($vGroup/@Amount)"/></xsl:attribute>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
desired output xml
<Vendor xmlns:ns1="http://xyzDemo.xyzDemo" VendorId="v1" VendorName="vaseline health">
<Customer CustId="c1" CustomerName="John Dillon" CustomerAddress="3093 jerfe st" Code="APL111" ClientSeqNo="1">
<POrders PId="P0110" PName="uuu aillw" Units="3" ServiceRef="T000" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" index="1" Code="APL111" AuthId="" CombinePOID="P0110" Amount="100"/>
<POrders PId="P0111" PName="uuu aillw" Units="3" ServiceRef="T000" PurchaseStart="09-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" index="2" Code="APL111" AuthId="" CombinePOID="P0111,P0112" Amount="200"/>
<POrders PId="P0113" PName="uuu aillw" Units="3" ServiceRef="T001" PurchaseStart="09-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" index="3" Code="APL111" AuthId="" CombinePOID="P0113,P0114,P0115,P0116,P0117,P0118" Amount="600"/>
</Customer>
<Customer CustId="C2" CustomerName="Mac Payne" CustomerAddress="3333 jerfe st" Code="APL113" ClientSeqNo="2">
<POrders PId="P2221" PName="uuu aillw" Units="3" ServiceRef="T000" PurchaseStart="01-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" index="1" Code="APL113" AuthId="" CombinePOID="P2221" Amount="100"/>
<POrders PId="P2222" PName="uuu aillw" Units="3" ServiceRef="T000" PurchaseStart="01-09-2012" PurchaseEnd="10-10-2011" WarehouseId="W2013" index="2" Code="APL113" AuthId="" CombinePOID="P2222,P2223" Amount="200"/>
<POrders PId="P2224" PName="uuu aillw" Units="3" ServiceRef="T001" PurchaseStart="01-09-2011" PurchaseEnd="10-10-2011" WarehouseId="W2023" index="3" Code="APL113" AuthId="" CombinePOID="P2224,P2225" Amount="200"/>
</Customer>
</Vendor>
The following works:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:ns1="http://XYZSampleDemo.XyxSampleDemo"
xmlns:ns1old="http://ABCSampleDemo.SampleDemo"
exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<!-- Standard xslt copy template -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Match any element (*) in the old namespace -->
<xsl:template match="@ns1old:*">
<!-- Output a new element in the new namespace -->
<xsl:element name="ns1:{local-name()}">
<!-- Copy all child attributes and nodes -->
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
However it made a bit of a mess of the namespace declarations themselves
Update: I was so close, all I needed to do was to add an @
in front of ns1old
in my template selector - this now exactly matches your desired output.
This stylesheet:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://ABCSampleDemo.SampleDemo"
xmlns:ns2="http://XYZSampleDemo.XyxSampleDemo"
exclude-result-prefixes="ns1">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[namespace::*[
. = 'http://ABCSampleDemo.SampleDemo'
]
]">
<xsl:element name="{name()}">
<xsl:copy-of
select="namespace::*[
not(.='http://ABCSampleDemo.SampleDemo')
]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="ns1:*" priority="1">
<xsl:element name="ns2:{local-name()}">
<xsl:copy-of
select="namespace::*[
not(.='http://ABCSampleDemo.SampleDemo')
]"/>
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@ns1:*">
<xsl:attribute name="ns2:{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Output:
<ns2:VEN VendorRef="24873" xmlns:ns2="http://XYZSampleDemo.XyxSampleDemo">
<CUS ClientRef="333444555" Code="ZZZZ">
<MEM MembershipRef="2406">
<ID AuthorizationId="1592"></ID>
</MEM>
<MEM MembershipRef="2407">
<ID AuthorizationId="1592"></ID>
</MEM>
</CUS>
<CUS ClientRef="333444551" Code="ZZZZ">
<MEM MembershipRef="2406">
<ID AuthorizationId="1592"></ID>
</MEM>
<MEM MembershipRef="2407">
<ID AuthorizationId="1592"></ID>
</MEM>
</CUS>
</ns2:VEN>
Note: Namespaces are not the same as attributes. This will remove any namespace declaration with http://ABCSampleDemo.SampleDemo
URI from the input source and keep any other one. Elements under this namespace URI (even as default namespace) will be replaced by elements under http://XYZSampleDemo.XyxSampleDemo
namespace URI (We can't give warranty about the namespace prefix). The same for attributes.
精彩评论