2016-10-12 8 views
-1

Im folgenden Beispiel sollten XML-Nachsätze zu "Number" -node-Wert gruppiert werden. Ich habe schon versucht, die Methode nach Muenchian zu gruppieren, aber ich habe es noch nicht geschafft. Die XSLT muss in 1.0 sein. Für jeden Number-Knoten sollte eine Box erstellt werden und jeder Wert sollte gruppiert werden. Probleme sind auch möglich mehrere Werte im Knoten, diese sollten separat angezeigt werden. Danke für jede Hilfe, die Sie mir dabei geben!XSLT-Gruppierung nach Geschwisterknotenwert

<main> 
<rbox> 
    <vNumber>002</vNumber> 
<bbox> 
    <State>Finland</State> 
    <gbox> 
     <Registrations> 
     <Registration>27754</Registration> 
     </Registrations> 
    </gbox> 
</bbox> 
<bbox> 
    <State>Denmark</State> 
    <gbox> 
     <Registrations> 
     <Registration>19481</Registration> 
     </Registrations> 
    </gbox> 
</bbox> 
</rbox> 

<rbox> 
    <vNumber>003</vNumber> 
<bbox> 
    <State>Slovenia</State> 
    <gbox> 
     <Registrations> 
     <Registration>H/11/019</Registration> 
     </Registrations> 
     <Registrations> 
     <Registration>H/11/020</Registration> 
     </Registrations> 
     <Registrations> 
     <Registration>H/11/021</Registration> 
     </Registrations> 
    </gbox> 
</bbox> 
<bbox> 
    <State>Sweden</State> 
    <gbox> 
     <Registrations> 
     <Registration>42852</Registration> 
     </Registrations> 
    </gbox> 
</bbox> 
</rbox> 
... 
</main> 

Ihre für Ihre schnelle Antwort danken:

<ROOT> 
<PROC> 
    <DATA> 
     <Number>002</Number> 
     <Registration>27754</Registration> 
     <Country>Finland</Country> 
    <DATA> 
    <PROC> 

<PROC> 
    <DATA> 
     <Number>003</Number> 
     <Registration>42852</Registration> 
     <Country>Sweden</Country> 
    <DATA> 
    <PROC> 

<PROC> 
    <DATA> 
     <Number>003</Number> 
     <Registration>H/11/019|H/11/020|H/11/021</Registration> 
     <Country>Slovenia</Country> 
    <DATA> 
    <PROC> 

<PROC> 
    <DATA> 
     <Number>002</Number> 
     <Registration>19481</Registration> 
     <Country>Denmark</Country> 
    <DATA> 
    <PROC> 
<PROC> 
    <DATA> 
     <Number>004</Number> 
     <Registration>09-23</Registration> 
     <Country>Norway</Country> 
    <DATA> 
    <PROC> 
</ROOT> 

Der obige Code sollte wie folgt dargestellt werden. Hier ist mein Code soweit. Ich konnte das Land und die Registrierungsdaten nicht dazu bringen, den Nummerneintrag zu sortieren, ohne mehrere Werte zu erstellen. Ich habe auch versucht, concate Werte in den Schlüssel "verwenden", aber das funktioniert auch nicht.

<xsl:key name="country" match="ROOT/PROC/DATA" use="Country"/> 
<xsl:key name="registration" match="ROOT/PROC/DATA" use="Registration"/> 

    <xsl:template match="/">   
    <main> 
     <xsl:for-each select="//Number[not(.=preceding::*)]"> 
     <rbox> 
       <xsl:element name="vNumber"> 
        <vNumber><xsl:value-of select="."/></vNumber>     
        <xsl:for-each select="//DATA[generate-id() = generate-id(key('country', Country)[1])]"> 
         <bbox> 
          <State><xsl:value-of select="Country"/></State> 
          <gbox> 
           <xsl:for-each select="//DATA[generate-id() = generate-id(key('registration', Registration)[1])]"> 
             <Registrations> 
              <Registration><xsl:value-of select="Registration"/></Registration> 
             </Registrations>  
           </xsl:for-each> 
          </gbox>     
         </bbox> 
        </xsl:for-each>  
       </xsl:element> 
     </rbox> 
     </xsl:for-each>    
</main> 
</xsl:template> 

**** EDIT: Komplettes Sheet nach Hilfe von michael.hor257k bezüglich Gruppierung Problem ---> Betroffene Produkte

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/" 
xmlns:maa="http://www.oma.trp/maa/" 
xmlns:rdm="http://www.oma.trp/dictionary/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"> 

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:param name="ns-prefix" select="'xfa'"/> 
<xsl:param name="ns-namespace" select="'http://www.xfa.org/schema/xfa-data/1.0/'"/> 
<xsl:param name="ns-prefix1" select="'maa'"/> 
<xsl:param name="ns-namespace1" select="'http://www.oma.trp/maa/'"/> 
<xsl:param name="ns-prefix2" select="'rdm'"/> 
<xsl:param name="ns-namespace2" select="'http://www.oma.trp/dictionary/'"/> 
<xsl:param name="ns-prefix3" select="'xsi'"/> 
<xsl:param name="ns-namespace3" select="'http://www.w3.org/2001/XMLSchemainstance'"/> 
<xsl:param name="ns-prefix4" select="'schemaLocation'"/> 
<xsl:param name="ns-namespace4" select="'http://www.oma.trp/maa/variations.xsd'"/> 
<xsl:param name="ns-schema" select="'http://www.oma.trp/maa/variations.xsd'"/> 
<xsl:variable name="vRdm" select="document('')/*/namespace::*[name()='rdm']"/> 
    <xsl:variable name="vXsi" select="document('')/*/namespace::*[name()='xsi']"/> 
    <xsl:variable name="vSchemaLocation" select="document('')/*/namespace::*[name()='schemaLocation']"/> 

<xsl:template match="/"> 
<xsl:element name="{$ns-prefix}:data" namespace="{$ns-namespace}"> 
    <xsl:element name="{$ns-prefix1}:eu_application_form" namespace="{$ns-namespace1}"> 
     <xsl:copy-of select="$vRdm"/> 
     <xsl:copy-of select="$vXsi"/> 
     <xsl:copy-of select="$vSchemaLocation"/> 
     <xsl:attribute name="xsi:schemaLocation"> 
      <xsl:value-of select="$ns-schema" /> 
     </xsl:attribute> 

<xsl:template match="/">  
      <maa:variations-form> 


      <xsl:element name="{$ns-prefix1}:applicationInformation"> 

        <xsl:element name="{$ns-prefix1}:human">1</xsl:element> 
        <xsl:element name="{$ns-prefix1}:veterinary">0</xsl:element> 
        <xsl:element name="{$ns-prefix1}:nationalAuthInMRP">1</xsl:element> 
        <xsl:element name="{$ns-prefix1}:euAuthorisation">0</xsl:element> 
        <xsl:element name="{$ns-prefix1}:nationalAuthorisation">0</xsl:element> 

        <xsl:element name="{$ns-prefix1}:procedureNumbers"> 
         <xsl:element name="{$ns-prefix1}:procedureNumber"></xsl:element> 
        </xsl:element> 

        <!--RMS country Loop start --> 

              <xsl:template match="/"> 
         <xsl:element name="{$ns-prefix1}:referenceMemberState"> 
          <xsl:choose> 
           <xsl:when test="ROOT/PROC/DATA/Procedure_Number[contains(text(),'DK')]"> 
            <xsl:text>Denmark</xsl:text> 
           </xsl:when> 
           <xsl:when test="ROOT/PROC/DATA/Procedure_Number[contains(text(),'SI')]"> 
            <xsl:text>Slovenia</xsl:text> 
           </xsl:when> 
          </xsl:choose> 
         </xsl:element> 
        </xsl:template> 

        <!--RMS country Loop end --> 

              <!--CMS country Loop start --> 


              <xsl:template match="/"> 
                <xsl:for-each select="//Country_Name[not(.=preceding::*)]"> 
                <maa:concernedMemberStates> 
                <maa:concernedMemberState><xsl:value-of select="."/></maa:concernedMemberState> 
                </maa:concernedMemberStates> 
                </xsl:for-each>    
              </xsl:template> 


        <!--CMS country Loop end --> 


        <!--CONCERNED PRODUCTS -->  
     </xsl:element> 
        <xsl:template match="/">  
        <main> 

        <products> 
        <maa:formAndStrengthFlag>0</maa:formAndStrengthFlag> 

        <maa:footnote/> 

        <!--CONCERNED PRODUCTS --> 

        <xsl:key name="strength" match="ROOT/PROC/DATA" use="Speciality_Number"/> 


         <xsl:for-each select="ROOT/PROC/DATA[generate-id() = generate-id(key('strength', Speciality_Number)[1])]"> 
          <redbox> 
           <variationNumber><xsl:value-of select="Speciality_Number"/></variationNumber> 

      <!-- for each member of the current group --> 
            <xsl:for-each select="key('strength', Speciality_Number)"> 
             <blueBox> 
              <memberState><xsl:value-of select="Country_Name"/></memberState> 
               <greenBox> 
                <maNumbers> 
                 <maNumber><xsl:value-of select="Registration_Number"/></maNumber>     
                </maNumbers> 
               </greenBox> 
             </blueBox> 
            </xsl:for-each>  
          </redbox> 
         </xsl:for-each>  




        </products> 

        </main> 
        </xsl:template>  

      </maa:variations-form> 
     </xsl:template> 


      </xsl:element> 
    <xsl:element name="FSTEMPLATE_">/Applications/eAFForms/1.20/Forms/Variation/Form/variation.xdp 
      </xsl:element> 
      <xsl:element name="FSFORMQUERY_">/Applications/eAFForms/1.20/Forms/Variation/Form/variation.xdp 
      </xsl:element> 
      <xsl:element name="FSTRANSFORMATIONID_">PDFForm</xsl:element> 
      <xsl:element name="FSTARGETURL_"/> 
      <xsl:element name="FSAWR_"/> 
      <xsl:element name="FSWR_"/> 
      <xsl:element name="FSCRURI_">repository://</xsl:element> 
      <xsl:element name="FSBASEURL_"/>   
    </xsl:element> 

</xsl:template> 

+1

schreiben Sie bitte Ihre Versuch, damit wir sie beheben können, anstatt dass der Code für Sie von Grund auf neu zu schreiben. –

Antwort

0

Wenn Sie die DATA Elemente gruppieren wollen Number, müssen Sie Ihren Schlüssel übereinstimmen DATA und Number verwenden.

Versuchen Sie das folgende Stylesheet:

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:key name="grp" match="DATA" use="Number"/> 

<xsl:template match="/ROOT">   
    <main> 
     <!-- create a group for each distinct Number --> 
     <xsl:for-each select="PROC/DATA[generate-id() = generate-id(key('grp', Number)[1])]"> 
      <rbox> 
       <vNumber> 
        <xsl:value-of select="Number"/> 
       </vNumber> 
       <!-- for each member of the current group --> 
       <xsl:for-each select="key('grp', Number)"> 
        <bbox> 
         <State> 
          <xsl:value-of select="Country"/> 
         </State> 
         <gbox> 
          <Registrations> 
           <xsl:copy-of select="Registration"/> 
          </Registrations> 
         </gbox> 
        </bbox> 
       </xsl:for-each>  
      </rbox> 
     </xsl:for-each> 
    </main> 
</xsl:template> 

</xsl:stylesheet> 

Ihre Eingabe ist nicht XML wohlgeformt, aber wenn die oben Sheet auf die folgende Eingabe angewendet wird:

XML

sein
<ROOT> 
    <PROC> 
    <DATA> 
     <Number>002</Number> 
     <Registration>27754</Registration> 
     <Country>Finland</Country> 
    </DATA> 
    </PROC> 
    <PROC> 
    <DATA> 
     <Number>003</Number> 
     <Registration>42852</Registration> 
     <Country>Sweden</Country> 
    </DATA> 
    </PROC> 
    <PROC> 
    <DATA> 
     <Number>003</Number> 
     <Registration>H/11/019|H/11/020|H/11/021</Registration> 
     <Country>Slovenia</Country> 
    </DATA> 
    </PROC> 
    <PROC> 
    <DATA> 
     <Number>002</Number> 
     <Registration>19481</Registration> 
     <Country>Denmark</Country> 
    </DATA> 
    </PROC> 
    <PROC> 
    <DATA> 
     <Number>004</Number> 
     <Registration>09-23</Registration> 
     <Country>Norway</Country> 
    </DATA> 
    </PROC> 
</ROOT> 

wird das Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <rbox> 
     <vNumber>002</vNumber> 
     <bbox> 
     <State>Finland</State> 
     <gbox> 
      <Registrations> 
       <Registration>27754</Registration> 
      </Registrations> 
     </gbox> 
     </bbox> 
     <bbox> 
     <State>Denmark</State> 
     <gbox> 
      <Registrations> 
       <Registration>19481</Registration> 
      </Registrations> 
     </gbox> 
     </bbox> 
    </rbox> 
    <rbox> 
     <vNumber>003</vNumber> 
     <bbox> 
     <State>Sweden</State> 
     <gbox> 
      <Registrations> 
       <Registration>42852</Registration> 
      </Registrations> 
     </gbox> 
     </bbox> 
     <bbox> 
     <State>Slovenia</State> 
     <gbox> 
      <Registrations> 
       <Registration>H/11/019|H/11/020|H/11/021</Registration> 
      </Registrations> 
     </gbox> 
     </bbox> 
    </rbox> 
    <rbox> 
     <vNumber>004</vNumber> 
     <bbox> 
     <State>Norway</State> 
     <gbox> 
      <Registrations> 
       <Registration>09-23</Registration> 
      </Registrations> 
     </gbox> 
     </bbox> 
    </rbox> 
</main> 
+0

Danke Michael, das hat funktioniert! Allerdings stehe ich jetzt vor einem neuen Problem, dieser Teil oben ist in einem Template match = "/" verschachtelt und dieser Teil wird einfach während der Transformation ignoriert. Kann ich das komplette Stylesheet unten platzieren oder sollte ich eine neue Frage öffnen? – Herbert

+0

Warum sollten Sie dies in einer anderen Vorlage verschachteln? Das obige ** ist ** ein komplettes Stylesheet; was willst du noch erreichen? –

+0

Ich habe meine erste Antwort mit meinem bis jetzt vollständigen Stylesheet editiert, darin steckt genistet das gelöste Problem bezüglich der Gruppierung der betroffenen Produkte. Problem ist jetzt, ich denke, dass es jetzt einen Konflikt für die Vorlage Regeln gibt, ignorieren "Betroffenes Produkt" Schleife (Ihre Lösung). – Herbert

Verwandte Themen