2016-04-07 4 views
0

Ich habe einen statischen Datensatz in XML, der verschiedene Daten enthält, die alle relational sind. Ich versuche, die Daten in umgekehrter Reihenfolge in eine UL-Liste zu sortieren, während ich die Einträge überspringe, die nicht dazu führen.Verschachtelte Gruppierung mit Muenchian-Methode

Datensatz:

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <landmarks> 
     <entry id="9932"> 
      <landmark-name>Statue of Liberty</landmark-name> 
      <linked-city link-id="432">New York</linked-city> 
     </entry> 
     <entry id="3020"> 
      <landmark-name>WTC</landmark-name> 
      <linked-city link-id="432">New York</linked-country> 
     </entry> 
     <entry id="5829"> 
      <landmark-name>Times Square</landmark-name> 
      <linked-city link-id="432">New York</linked-country> 
     </entry> 
     <entry id="2348"> 
      <landmark-name>Eiffel Tower</landmark-name> 
      <linked-city link-id="932">Paris</linked-country> 
     </entry> 
     <entry id="2348"> 
      <landmark-name>Hollywood</landmark-name> 
      <linked-city link-id="458">Los Angeles</linked-country> 
     </entry> 
     <entry id="4592"> 
      <landmark-name>Museo Nacional de Antropología</landmark-name> 
      <linked-city link-id="328">Mexico City</linked-country> 
     </entry> 
    </landmarks> 
    <cities> 
     <entry id="432"> 
      <city-name>New York</city-name> 
      <linked-country link-id="21">United States</linked-country> 
     </entry> 
     <entry id="458"> 
      <city-name>Los Angeles</city-name> 
      <linked-country link-id="21">United States</linked-country> 
     </entry> 
     <entry id="832"> 
      <city-name>Miami</city-name> 
      <linked-country link-id="21">United States</linked-country> 
     </entry> 
     <entry id="932"> 
      <city-name>Paris</city-name> 
      <linked-country link-id="58">France</linked-country> 
     </entry> 
     <entry id="392"> 
      <city-name>Nice</city-name> 
      <linked-country link-id="58">France</linked-country> 
     </entry> 
     <entry id="328"> 
      <city-name>Mexico City</city-name> 
      <linked-country link-id="2">Mexico</linked-country> 
     </entry> 
    </cities> 
    <countries> 
     <entry id="21"> 
      <country>United States</country> 
     </entry> 
     <entry id="42"> 
      <country>Canada</country> 
     </entry> 
     <entry id="2"> 
      <country>Mexico</country> 
     </entry> 
     <entry id="58"> 
      <country>France</country> 
     </entry> 
     <entry id="23"> 
      <country>Spain</country> 
     </entry> 
    </countries> 
</data> 

Gewünschtes Ergebnis:

<ul> 
    <li>United States 
     <ul> 
      <li>New York 
       <ul> 
        <li>Statue of Liberty</li> 
        <li>Times Square</li> 
        <li>WTC</li> 
       </ul> 
      </li> 
      <li>Los Angeles 
       <ul> 
        <li>Hollywood</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
    <li>France 
     <ul> 
      <li>Paris 
       <ul> 
        <li>Eiffel Tower</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
    <li>Mexico 
     <ul> 
      <li>Mexico City 
       <ul> 
        <li>Museo Nacional de Antropología</li> 
       </ul> 
      </li> 
     </ul> 
    </li> 
</ul> 

Ich brauche zuerst wir alle Sehenswürdigkeiten erhalten Sinn die Daten aus dem Aspekt der „Sehenswürdigkeiten“ zu einer Gruppe in der Lage sein und dann sehen Sie, in welcher Stadt sie sich befinden und in welchem ​​Land sie sich befinden. Wie wir die Liste füllen Städte, die mit ihnen verknüpfte Nullmarken haben, sollten weggelassen werden. Länder, die Städte haben, die keine Landmarken haben, sollten aus dem Endergebnis (wie oben gezeigt) ausgeschlossen werden.

Ich weiß wie man Landmarken unter den Städten nach der Münchischen Methode gruppiert, aber was mich von der Strecke abbringt ist, dass ich sie jetzt unter Länder gruppieren muss, während ich ihnen Länder unterstelle, die keine Städte oder Landmarken darunter haben.

Kann mir jemand die richtige Richtung zeigen?

Antwort

0

Ich sehe das nicht als Gruppierung Problem, sondern können Sie verschiedene Schlüssel verwenden, um alle diese Verweise folgen:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <xsl:output method="html" indent="yes"/> 

    <xsl:key name="ref-city" match="cities/entry" use="linked-country/@link-id"/> 
    <xsl:key name="ref-mark" match="landmarks/entry" use="linked-city/@link-id"/> 

    <xsl:template match="data"> 
     <ul> 
      <xsl:apply-templates 
       select="countries/entry" 
      /> 
     </ul> 
    </xsl:template> 

    <xsl:template match="countries/entry"> 
     <xsl:variable name="cities" select="key('ref-city', @id)"/> 
     <xsl:variable name="landmarks" select="key('ref-mark', $cities/@id)"/> 
     <xsl:if test="$landmarks"> 
      <li> 
       <xsl:value-of select="country"/> 
       <ul> 
        <xsl:apply-templates select="$cities"/> 
       </ul> 
      </li> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="cities/entry"> 
     <xsl:variable name="landmarks" select="key('ref-mark', @id)"/> 
     <xsl:if test="$landmarks"> 
      <li> 
       <xsl:value-of select="city-name"/> 
       <ul> 
        <xsl:apply-templates select="$landmarks"/> 
       </ul> 
      </li> 
     </xsl:if> 
    </xsl:template> 

    <xsl:template match="landmarks/entry"> 
     <li> 
      <xsl:value-of select="landmark-name"/> 
     </li> 
    </xsl:template> 
</xsl:stylesheet>