2016-09-21 2 views
1

unter der Eingabe xml ist: -Include-Tags in XSLT für jede Kopie

<request version="1" type="PrintFPDPackInput"> 

    <keys> 
<key name="Date" value="02/01/2010 01:00:25" /> 
<key name="AmtGross" value="22.33" /> 
<key name="AmtNet" value="17.86" /> 
<key name="ContribType" value="Individual" /> 

<key name="Date" value="01/01/2010 01:00:26" /> 
<key name="AmtGross" value="22.25" /> 
<key name="AmtNet" value="17.80" /> 
<key name="ContribType" value="Individual" /> 

<key name="Date" value="12/01/2009 01:00:27" /> 
<key name="AmtGross" value="22.25" /> 
<key name="AmtNet" value="17.80" /> 
<key name="ContribType" value="Individual" /> 


    </keys> 
</request> 

Die XSLT verarbeitet: -

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <!-- <xsl:param name="User"/> 
    <xsl:param name="Password"/> --> 

    <xsl:template match="/"> 

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
         xmlns:fpd="http://zip.uk.zurich.com/fpdservice"> 
     <soapenv:Header/> 

<soapenv:Body> 
<fpd:CheckFPD> 

<xsl:copy> 
<policy> 
     <xsl:apply-templates select="request/keys/key[@name = 'Date' or @name = 'AmtGross' or @name = 'AmtNet' or @name = 'ContribType']" /> 
</policy> 
    </xsl:copy> 






</fpd:CheckFPD> 
      </soapenv:Body> 
     </soapenv:Envelope> 
    </xsl:template> 

<xsl:template match="key[@name = 'Date' or @name = 'AmtGross' or @name = 'AmtNet' or @name = 'ContribType' ]"> 
     <xsl:element name="{@name}"> 
      <xsl:value-of select="@value" /> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

Dies ist der Fehlerausgang I wie unten bin immer: http://xslttest.appspot.com/

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:fpd="http://zip.uk.zurich.com/fpdservice"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <fpd:CheckFPD> 
     <policy> 
      <Date>02/01/2010 01:00:25</Date> 
      <AmtGross>22.33</AmtGross> 
      <AmtNet>17.86</AmtNet> 
      <ContribType>Individual</ContribType> 
      <Date>01/01/2010 01:00:26</Date> 
      <AmtGross>22.25</AmtGross> 
      <AmtNet>17.80</AmtNet> 
      <ContribType>Individual</ContribType> 
      <Date>12/01/2009 01:00:27</Date> 
      <AmtGross>22.25</AmtGross> 
      <AmtNet>17.80</AmtNet> 
      <ContribType>Individual</ContribType> 
     </policy> 
     </fpd:CheckFPD> 
    </soapenv:Body> 
</soapenv:Envelope> 

Erwartete Ausgabe wie folgt: -

<ListOfPolicyReceipts> 
          <PolicyReceipts> 
           <Date>02/01/2010 01:00:25</Date> 
           <AmtGross>22.33</AmtGross> 
           <AmtNet>17.86</AmtNet> 
           <ContribType>Individual</ContribType> 
          </PolicyReceipts> 
          <PolicyReceipts> 
           <Date>01/01/2010 01:00:26</Date> 
           <AmtGross>22.25</AmtGross> 
           <AmtNet>17.80</AmtNet> 
           <ContribType>Individual</ContribType> 
          </PolicyReceipts> 
          <PolicyReceipts> 
           <Date>12/01/2009 01:00:27</Date> 
           <AmtGross>22.25</AmtGross> 
           <AmtNet>17.80</AmtNet> 
           <ContribType>Individual</ContribType> 
          </PolicyReceipts> 

vorschlagen freundlichen Prozess der Tags PolicyReceipts für jede Kopie von Daten angewandt werden

+0

Wenn das Ihre erwartete Ausgabe ist, warum erstellt Ihr Stylesheet einen SOAP-Umschlag und Header? –

+0

verwandt [thread] (http://stackoverflow.com/questions/39575072/anattribute-node-cannot-be-created-after-a-child-of-the-containing-element). das ist - ich würde es nennen - ein "Addon" -Thread. – uL1

Antwort

0

Ich kann die XSD sehen, so nehme ich an, der Tag ListOfPolicyReceiptspolicy den Tag ersetzen wird. Aber ich bin mir ziemlich sicher, dass Sie den folgenden Code an der richtigen Stelle in Ihrem Stylesheet implementieren können.

<ListOfPolicyReceipts> 
    <xsl:for-each select="request/keys/key[@name = 'Date']"> 
     <PolicyReceipts> 
      <xsl:apply-templates select=". | following-sibling::key[@name = 'AmtGross'][1] | following-sibling::key[@name = 'AmtNet'][1] | following-sibling::key[@name = 'ContribType'][1]"/> 
     </PolicyReceipts> 
    </xsl:for-each> 
</ListOfPolicyReceipts> 

Wichtig:

  • alle 4 Elemente mit date, AmtGross, AmtNet und ContribType müssen seinen Namen in dieser bestimmten Reihenfolge

    Wahrscheinlich können Sie diese verwenden!

  • alle 4 Elemente müssen vorhanden sein; wenn einer fehlt, wird die Xslt fehlschlagen und Ausgang falsche Daten [wahrscheinlich die Ausgabe ist gültig, aber der Inhalt ist falsch]
+0

Danke !!! Dies funktioniert absolut gut und die Schritte sind auch wie erwartet. – Raghava

0

Die entsandte erwartete Ausgabe von ganz einfach erreicht werden kann:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/request"> 
    <ListOfPolicyReceipts> 
     <xsl:apply-templates select="keys/key[@name = 'Date']"/> 
    </ListOfPolicyReceipts> 
</xsl:template> 

<xsl:template match="key"> 
    <PolicyReceipts> 
     <xsl:for-each select=". | following-sibling::key[position() &lt; 4]"> 
      <xsl:element name="{@name}"> 
       <xsl:value-of select="@value" /> 
      </xsl:element> 
     </xsl:for-each> 
    </PolicyReceipts> 
</xsl:template> 

</xsl:stylesheet> 

Dies wird unter der Annahme der Eingabe wird die key Elemente in Gruppen von 4 immer Liste mit <key name="Date"> die ersten in seiner Gruppe.