2011-05-04 7 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 변환으로 복사하는 것입니다. 이 텍스트를 이해하기가 어렵습니다 –

+0

@Dimitre : 요청한대로 실제 입력, 출력 및 사용중인 xsl 업데이트했습니다. 모든 특성을 제거하는 것이 가독성에 도움이 될 것이라고 생각했습니다. 감사합니다. 위의 변환을 수행 할 수 있습니다. – bluesnowxyz

답변

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> 
,745 이 - 나는 내가 할하는 데 필요한 모든 내 템플릿 선택에 ns1old 앞에서 @을 추가, 그래서 가까이 :

그러나 그것은 공간의 혼란의 비트가 스스로

업데이트 선언의 만든 이제 원하는 출력과 정확히 일치합니다.

+0

이'@ ns1old : *'는 해당 네임 스페이스 아래에있는 '속성'과 일치합니다. –

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

@Alejandro : 감사합니다. 스타일 et는 절대적으로 잘 작동합니다. 내가 원하는 스타일을 출력하지 못하는 스타일 시트에 추가 할 때만. 그걸 도와 줄 수 있어요? 미리 감사드립니다. – bluesnowxyz

+0

@bluesnowxyz : 저는 이것을 2 단계 변환으로 실행하는 것이 가장 좋을 것이라고 생각합니다. http://stackoverflow.com/questions/4237531/is-there-a-technique-to-combine-a-pipeline-of-xsl-transformations-into-a-single-t를 참조하십시오. –

관련 문제