开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜