2016-05-12 19 views
1

Kopieren I XLST 1,0 zu halten, die Hierarchie des Eingangs unten nutzen möchte, aber die Reihenfolge ändern, so dass alle termGrp Knoten, deren descrip Knoten haben das Attribut @type=Bevorzugt kommen vor allen anderen.Wie zu ändern, um durch die Elemente mit bestimmten Attributen ersten in XSLT 1.0

In meiner erwarteten Ausgabe kann diese Änderung als der Begriff Immatrikulationsfrist angesehen werden und wird vor Einschreibefrist in der Eingabedatei Einschreibefrist (sic.) Sortiert, die zuerst kommt.

Ich denke, der richtige Weg besteht darin, die Identitätsvorlage zu verwenden, aber ich kann nicht herausfinden, wie man danach sortiert, um sicherzustellen, dass Elemente mit einem bestimmten Attribut zuerst behandelt werden. Ich habe mir <xsl:sort> angesehen, aber ich lerne gerade und ich bin mir nicht sicher, wie ich das angehen soll und würde einige Hinweise wirklich schätzen.

INPUT

<?xml version="1.0" encoding="utf-8" ?> 
<mtf> 
    <conceptGrp> 
     <concept>371</concept> 
     <transacGrp> 
      <transac type="origination"> 
       LookUp Admin 
      </transac> 
      <date> 
       2016-05-12T10:12:39 
      </date> 
     </transacGrp> 
     <transacGrp> 
      <transac type="modification"> 
       LookUp Admin 
      </transac> 
      <date> 
       2016-05-12T10:12:39 
      </date> 
     </transacGrp> 
     <descripGrp> 
      <descrip type="Definition">The timespan during which you can enrol in a degree programme.</descrip> 
     </descripGrp> 
     <descripGrp> 
      <descrip type="Status">freigegeben</descrip> 
     </descripGrp> 
     <languageGrp> 
      <language lang="DE" type="German" /> 
      <descripGrp> 
       <descrip type="Context">Nach Ablauf der Immatrikulationsfrist ist es nicht mehr möglich, sich für einen Studiengang einzuschreiben.</descrip> 
      </descripGrp> 
      <termGrp> 
       <term>Einschreibefrist</term> 
       <descripGrp> 
        <descrip type="Segmentation">Ein-schrei-be-frist</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Gender">f.</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">Variant</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
      <termGrp> 
       <term>Immatrikulationsfrist</term> 
       <descripGrp> 
        <descrip type="Segmentation">Im-ma-tri-ku-la-ti-ons-frist</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Gender">f.</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Bevorzugt">1</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
     </languageGrp> 
     <languageGrp> 
      <language lang="EN" type="English" /> 
      <descripGrp> 
       <descrip type="Context">Please make sure to transfer the semester fee before the enrolment deadline.</descrip> 
      </descripGrp> 
      <termGrp> 
       <term>enrollment deadline</term> 
       <descripGrp> 
        <descrip type="Segmentation">en-roll-ment dead-line</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Geographical Usage">AmE</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
      <termGrp> 
       <term>enrolment deadline</term> 
       <descripGrp> 
        <descrip type="Segmentation">en-rol-ment dead-line</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Geographical Usage">BrE</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
     </languageGrp> 
    </conceptGrp> 
</mtf> 

ERWARTETES ERGEBNIS

<?xml version="1.0" encoding="utf-8" ?> 

<mtf> 
    <conceptGrp> 
     <concept>371</concept> 
     <transacGrp> 
      <transac type="origination"> 
       LookUp Admin 
      </transac> 
      <date> 
       2016-05-12T10:12:39 
      </date> 
     </transacGrp> 
     <transacGrp> 
      <transac type="modification"> 
       LookUp Admin 
      </transac> 
      <date> 
       2016-05-12T10:12:39 
      </date> 
     </transacGrp> 
     <descripGrp> 
      <descrip type="Definition">The timespan during which you can enrol in a degree programme.</descrip> 
     </descripGrp> 
     <descripGrp> 
      <descrip type="Status">freigegeben</descrip> 
     </descripGrp> 
     <languageGrp> 
      <language lang="DE" type="German" /> 
      <descripGrp> 
       <descrip type="Context">Nach Ablauf der Immatrikulationsfrist ist es nicht mehr möglich, sich für einen Studiengang einzuschreiben.</descrip> 
      </descripGrp> 
      <termGrp> 
       <term>Immatrikulationsfrist</term> 
       <descripGrp> 
        <descrip type="Segmentation">Im-ma-tri-ku-la-ti-ons-frist</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Gender">f.</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Bevorzugt">1</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 

      <termGrp> 
       <term>Einschreibefrist</term> 
       <descripGrp> 
        <descrip type="Segmentation">Ein-schrei-be-frist</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Gender">f.</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">Variant</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 

     </languageGrp> 
     <languageGrp> 
      <language lang="EN" type="English" /> 
      <descripGrp> 
       <descrip type="Context">Please make sure to transfer the semester fee before the enrolment deadline.</descrip> 
      </descripGrp> 
      <termGrp> 
       <term>enrollment deadline</term> 
       <descripGrp> 
        <descrip type="Segmentation">en-roll-ment dead-line</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Geographical Usage">AmE</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
      <termGrp> 
       <term>enrolment deadline</term> 
       <descripGrp> 
        <descrip type="Segmentation">en-rol-ment dead-line</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Geographical Usage">BrE</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Part of Speech">Noun</descrip> 
       </descripGrp> 
       <descripGrp> 
        <descrip type="Term Type">fullForm</descrip> 
       </descripGrp> 
       <transacGrp> 
        <transac type="origination"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
       <transacGrp> 
        <transac type="modification"> 
         LookUp Admin 
        </transac> 
       </transacGrp> 
      </termGrp> 
     </languageGrp> 
    </conceptGrp> 
</mtf> 
+1

Es gibt keine 'Term'-Elemente, die untergeordnete Elemente in Ihrem XML enthalten. –

+0

Vielen Dank für den Hinweis auf diesen Fehler, ich habe die Struktur meiner Datei falsch verstanden und die Terminologie falsch verwendet. Ich habe jetzt meinen ursprünglichen Post bearbeitet und hoffe, dass es jetzt klarer ist, was ich erreichen möchte - Entschuldigung. – user2564684

+0

Wie sieht Ihre gewünschte Ausgabe aus? – zx485

Antwort

1

Versuchen Sie so etwas wie:

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="*"/> 

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

<xsl:template match="languageGrp"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[not(self::termGrp)]"/> 
     <xsl:apply-templates select="termGrp[descripGrp/descrip/@type='Bevorzugt']"/> 
     <xsl:apply-templates select="termGrp[not(descripGrp/descrip/@type='Bevorzugt')]"/> 
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Beachten Sie, dass dies, dass es innerhalb eines languageGrp übernimmt keine Knoten, die nach termGrp kommen - sonst wird diese in eine neue Position bewegt werden, die die termGrp Knoten vorausgeht.

+0

Danke für eine funktionierende Lösung und für das Aufzeigen potentieller Probleme, wenn es Knoten gibt, die nach 'termGrp' kommen. Bei meinem Versuch hatte ich das 'termGrp' in der zweiten Vorlage anstelle von' languageGrp' gefunden. – user2564684

Verwandte Themen