2011-05-04 84 views
1

我已經搜索,但我找不到適當的解決方案來處理xslt 1.0中的名稱空間。每個節點都有很多屬性,但爲了便於閱讀,我沒有給出它們。從源xml替換名稱空間

我的輸入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:variable 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> 

期望的輸出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> 
+0

首先,您需要格式化您的代碼,使其至少可見(更好:甚至可讀。選擇代碼並單擊「{}」按鈕。即使在此之後,您還需要添加一個口頭描述如果你不提供這些信息,那麼一個有效的解決方案就是將你想要的輸出複製到一個無關緊要的無意義的XSLT轉換中,請改進這很難理解文本 – 2011-05-04 03:53:25

+0

@Dimitre:按照要求我已經更新了實際的輸入,輸出和當前使用的xsl,我認爲刪除所有這些屬性對於可讀性會有幫助。謝謝。是否有可能進行上述轉換。 – bluesnowxyz 2011-05-05 00:11:47

回答

0

以下工作:

<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> 

然而,它做了一個有點命名空間的亂七八糟的宣佈自己

更新:我是如此接近,所有我需要做的是對的ns1old前在我的模板選擇添加一個@ - 這現在完全匹配您所需的輸出。

+0

這個'@ ns1old:*'匹配那個名字空間下的任何'attribute'。 – 2011-05-04 17:22:45

0

這個樣式表:

<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> 

輸出:

<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> 

注意:命名空間是不一樣的屬性。這將刪除任何來自輸入源的使用http://ABCSampleDemo.SampleDemo URI的名稱空間聲明,並保留任何其他名稱空間聲明。此名稱空間URI下的元素(甚至作爲默認名稱空間)將由http://XYZSampleDemo.XyxSampleDemo名稱空間URI(下的元素替換)我們不能保證名稱空間前綴)。屬性相同。

+0

@Ajjandro:Thanks.your styleshe等作品絕對好。只有當我追加它與我的樣式表時,它不會產生所需的輸出。你能幫助我嗎?提前致謝。 – bluesnowxyz 2011-05-05 00:09:53

+0

@bluesnowxyz:我認爲最好將這些作爲一個兩階段轉換來運行。見http://stackoverflow.com/questions/4237531/is-there-a-technique-to-combine-a-pipeline-of-xsl-transformations-into-a-single-t – 2011-05-05 01:00:52