2016-06-17 17 views
0

Ich habe Eingabe XML wie unten und erwartet Ausgabe wie folgt.Kopiere partielle xml mit XSLT

Eingang xml:

<GetItemResponse xmlns="urn:api:pis:BaseComponents"> 
    <Ack>Success</Ack> 
    <Item> 
     <AutoPay>false</AutoPay> 
     <ListingDetails> 
      <Adult>false</Adult> 
      <EndingReason>NotAvailable</EndingReason> 
     </ListingDetails> 
     <Duration>35</Duration> 
     <ShippingDetails> 
      <ApplyShippingDiscount>false</ApplyShippingDiscount> 
      <CalculatedShippingRate> 
       <WeightMajor measurementSystem="English" unit="lbs">0</WeightMajor> 
       <WeightMinor measurementSystem="English" unit="oz">0</WeightMinor> 
      </CalculatedShippingRate> 
      <SalesTax> 
       <SalesTaxPercent>0.0</SalesTaxPercent> 
       <ShippingIncludedInTax>false</ShippingIncludedInTax> 
      </SalesTax> 
      <ShippingServiceOptions> 
       <ShippingService>ShippingMethodStandard</ShippingService> 
       <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost> 
       <ShippingServiceAdditionalCost currencyID="USD">0.0</ShippingServiceAdditionalCost> 
       <ShippingServicePriority>1</ShippingServicePriority> 
       <ExpeditedService>false</ExpeditedService> 
       <ShippingTimeMin>1</ShippingTimeMin> 
       <ShippingTimeMax>6</ShippingTimeMax> 
       <FreeShipping>true</FreeShipping> 
      </ShippingServiceOptions> 
      <ExcludeShipToLocation>PO Box</ExcludeShipToLocation> 
      <SellerExcludeShipToLocationsPreference>true</SellerExcludeShipToLocationsPreference> 
     </ShippingDetails> 
     <ShipToLocations>US</ShipToLocations> 
     <HideFromSearch>false</HideFromSearch> 
    </Item> 
</GetItemResponse> 

Die Ausgabe xml sollte aussehen wie:

<ShippingDetails> 
      <ApplyShippingDiscount>false</ApplyShippingDiscount> 
      <CalculatedShippingRate> 
       <WeightMajor measurementSystem="English" unit="lbs">0</WeightMajor> 
       <WeightMinor measurementSystem="English" unit="oz">0</WeightMinor> 
      </CalculatedShippingRate> 
      <SalesTax> 
       <SalesTaxPercent>0.0</SalesTaxPercent> 
       <ShippingIncludedInTax>false</ShippingIncludedInTax> 
      </SalesTax> 
      <ShippingServiceOptions> 
       <ShippingService>ShippingMethodStandard</ShippingService> 
       <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost> 
       <ShippingServiceAdditionalCost currencyID="USD">0.0</ShippingServiceAdditionalCost> 
       <ShippingServicePriority>1</ShippingServicePriority> 
       <ExpeditedService>false</ExpeditedService> 
       <ShippingTimeMin>1</ShippingTimeMin> 
       <ShippingTimeMax>6</ShippingTimeMax> 
       <FreeShipping>true</FreeShipping> 
      </ShippingServiceOptions> 
      <ExcludeShipToLocation>PO Box</ExcludeShipToLocation> 
      <SellerExcludeShipToLocationsPreference>true</SellerExcludeShipToLocationsPreference> 
     </ShippingDetails> 

Daher habe ich Schreib Xslt soetwas wie, unter dem nicht funktioniert. Ich benutze xslt 2.0. Bitte hilf mir mit dieser XSLT-Transformation.

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns="urn:ebay:apis:eBLBaseComponents"> 
    <xsl:output indent="yes" method="xml" encoding="utf-8" omit-xml-declaration="yes" /> 
    <xsl:template match="/"> 
     <ItemFee> 
      <product_id></product_id> 
      <Details> 
       <xsl:choose> 
        <xsl:when test="/ns:GetItemResponse/ns:Ack = 'Failure'"> 
         <Ack>Failure</Ack> 
         <itemid>0</itemid> 
         <ebay_listing_status>-3</ebay_listing_status> 
         <status>FALSE</status> 
         <listed_timestamp>now</listed_timestamp> 
         <listing_reason> 
          <xsl:value-of select="/ns:GetItemResponse/ns:Errors[position()=last()]/ns:LongMessage"/> 
         </listing_reason> 
        </xsl:when> 
        <xsl:otherwise> 
        </xsl:otherwise> 
       </xsl:choose> 
      </Details> 
     </ItemFee> 
    </xsl:template> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:template> 
    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 

<xsl:template match="ShippingDetails"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 
+1

Bitte erläutern Sie die erforderliche Logik der Transformation ** in Worten **, nicht (nur) als Beispiel. –

Antwort

2

Wenn Sie ein Element, um einfach zu extrahieren und den Namespace Streifen dann sollte es genügen

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xpath-default-namespace="urn:api:pis:BaseComponents" 
    exclude-result-prefixes="xs" 
    version="2.0"> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
      <xsl:copy-of select="@*"/> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/GetItemResponse/Item[1]/ShippingDetails[1]"/> 
    </xsl:template> 

</xsl:stylesheet> 

zu verwenden, wenn ich Saxon 9.7 HE gegen geposteten Eingangsprobe verwendet

<?xml version="1.0" encoding="UTF-8"?> 
<GetItemResponse xmlns="urn:api:pis:BaseComponents"> 
    <Ack>Success</Ack> 
    <Item> 
     <AutoPay>false</AutoPay> 
     <ListingDetails> 
      <Adult>false</Adult> 
      <EndingReason>NotAvailable</EndingReason> 
     </ListingDetails> 
     <Duration>35</Duration> 
     <ShippingDetails> 
      <ApplyShippingDiscount>false</ApplyShippingDiscount> 
      <CalculatedShippingRate> 
       <WeightMajor measurementSystem="English" unit="lbs">0</WeightMajor> 
       <WeightMinor measurementSystem="English" unit="oz">0</WeightMinor> 
      </CalculatedShippingRate> 
      <SalesTax> 
       <SalesTaxPercent>0.0</SalesTaxPercent> 
       <ShippingIncludedInTax>false</ShippingIncludedInTax> 
      </SalesTax> 
      <ShippingServiceOptions> 
       <ShippingService>ShippingMethodStandard</ShippingService> 
       <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost> 
       <ShippingServiceAdditionalCost currencyID="USD">0.0</ShippingServiceAdditionalCost> 
       <ShippingServicePriority>1</ShippingServicePriority> 
       <ExpeditedService>false</ExpeditedService> 
       <ShippingTimeMin>1</ShippingTimeMin> 
       <ShippingTimeMax>6</ShippingTimeMax> 
       <FreeShipping>true</FreeShipping> 
      </ShippingServiceOptions> 
      <ExcludeShipToLocation>PO Box</ExcludeShipToLocation> 
      <SellerExcludeShipToLocationsPreference>true</SellerExcludeShipToLocationsPreference> 
     </ShippingDetails> 
     <ShipToLocations>US</ShipToLocations> 
     <HideFromSearch>false</HideFromSearch> 
    </Item> 
</GetItemResponse> 

Der Ausgang ist

<?xml version="1.0" encoding="UTF-8"?><ShippingDetails> 
         <ApplyShippingDiscount>false</ApplyShippingDiscount> 
         <CalculatedShippingRate> 
           <WeightMajor measurementSystem="English" unit="lbs">0</WeightMajor> 
           <WeightMinor measurementSystem="English" unit="oz">0</WeightMinor> 
         </CalculatedShippingRate> 
         <SalesTax> 
           <SalesTaxPercent>0.0</SalesTaxPercent> 
           <ShippingIncludedInTax>false</ShippingIncludedInTax> 
         </SalesTax> 
         <ShippingServiceOptions> 
           <ShippingService>ShippingMethodStandard</ShippingService> 
           <ShippingServiceCost currencyID="USD">0.0</ShippingServiceCost> 
           <ShippingServiceAdditionalCost currencyID="USD">0.0</ShippingServiceAdditionalCost> 
           <ShippingServicePriority>1</ShippingServicePriority> 
           <ExpeditedService>false</ExpeditedService> 
           <ShippingTimeMin>1</ShippingTimeMin> 
           <ShippingTimeMax>6</ShippingTimeMax> 
           <FreeShipping>true</FreeShipping> 
         </ShippingServiceOptions> 
         <ExcludeShipToLocation>PO Box</ExcludeShipToLocation> 
         <SellerExcludeShipToLocationsPreference>true</SellerExcludeShipToLocationsPreference> 
       </ShippingDetails> 
+0

Dies ergibt kein erwartetes Ergebnis. Dies erzeugt leeres XML als Ausgabe. Wir können Online-Xslt-Transformator-Tool auch kreuzen. – Simbu

+0

@Simbu, ich habe Informationen über den XSLT 2.0-Prozessor, den ich zum Testen verwendet habe, und die Test-Ein- und Ausgabedaten hinzugefügt, wie es scheint. Sie müssen uns mitteilen, welchen XSLT 2.0-Prozessor Sie verwendet haben. –

+0

Danke Es hat für mich funktioniert. :) – Simbu