2017-10-09 2 views
-1

Hier ist der XML:XSLT: Wie bekomme ich diese Ausgabe?

<list title="Shopping list"> 
    <item>Orange juice</item> 
    <item>Bread</item> 
    <item> 
     <list title="Cake ingredients"> 
     <item>Flour</item> 
     <item>Eggs</item> 
     <item>Milk</item> 
     <item>Sugar</item> 
     <item> 
      <list title="Chocolate icing ingredients" 
     </list> 
     <item>Cocoa powder</item> 
     <item>Icing mixture</item> 
     <item>Unsalted butter</item> 
</list> 
</item> 
</list> 
</item> 
</list> 

Die erforderliche Ausgabe sein:

Einkaufsliste:
1 Bread
Kuchen Zutaten Zutaten
2.1 Schokoladenglasur:
2.1.1 Cocoa Pulver
2.1.2 Vereisungsgemisch
2.1.3 Ungesalzene Butter
2.2 Eier
2.3 Mehl
2.4 Milch
2.5 Zucker
3 Orangensaft

Wie würde ich über das tun dies gehen? Ich war in der Lage, position() zu verwenden, um einige Knoten zu nummerieren und zu sortieren, um einige Elemente zu sortieren, aber ich war nicht in der Lage, alles zu tun.

+2

Sie sagten, Sie hätten die Position() verwenden können, um die Knoten zu nummerieren. Zeigen Sie uns also, was Sie bisher getan haben. – Steve

+1

Möchten Sie eigentlich nur Text hier ausgeben? Oder versuchen Sie tatsächlich HTML auszugeben? –

+1

@TimC Ich möchte den Text ausgeben – fredjohnson

Antwort

0

Sie haben es nicht ausdrücklich erklären, aber ich merkte, dass:

  • Die Elemente auf einem bestimmten Niveau umfassen umfassen sollte:
    • „Blatt“ item Elemente (ohne Nachkommen Knoten), der Text zu drucken ist ihr Inhalt,
    • list Elemente - Kinder von „nicht-Blatt“ item Elemente, aber diesmal der Text zu drucken ist ihre title Attribut
  • Die erforderliche Reihenfolge auf einer bestimmten Ebene ist der zu druckende Text.

die erforderliche Rekursion zu erhalten, sollte das Skript mit startet eine Vorlage in das Stamm list Element Anwendung und Vorlagen dann auf der nächsten Ebene auf die Elemente anwenden.

Ich schrieb eine "universelle" Vorlage für beide Fälle (list und Blatt item Elemente).

Diese Schablone hat 2 Optionale Parameter:

  • nr - Elementnummer (auf dieser Ebene),
  • prefix - kumulierte Zahlen von höheren Ebenen.

pref Variable enthält die "zusammengesetzt" (multi-level) Zahl und auch in der rekursiven Template Anwendung verwendet werden gedruckt werden.

Der letzte Teil dieser Vorlage enthält 2 Varianten für list bzw. item.

Die list Variante:

  • Drucke title Attribut,
  • Elemente für die nächste Stufe auswählt,
  • und in einer sortierten Schleife gilt die Vorlage auf sie.

Die item Variante druckt nur den Inhalt.

Also das ganze Skript sieht unten wie:

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

    <xsl:template match="/"> 
    <xsl:apply-templates select="list"/> 
    </xsl:template> 

    <xsl:template match="list | item[not(*)]"> 
    <xsl:param name="nr" required="no" select="0"/> 
    <xsl:param name="prefix" required="no" select="''"/> 
    <xsl:variable name="pref" select=" 
     if ($nr = 0) then '' 
     else if ($prefix) then concat($prefix, '.', $nr) 
     else $nr"/> 
    <xsl:value-of select=" 
     if ($pref) then concat($pref, ' ') 
     else ''"/> 
    <xsl:if test="name()='list'"> 
     <xsl:value-of select="concat(@title, '&#xA;')"/> 
     <xsl:variable name="items" select="item[not(*)] | item/list"/> 
     <xsl:for-each select="$items"> 
     <xsl:sort select="if (name() = 'list') then @title else ."/> 
     <xsl:apply-templates select="."> 
      <xsl:with-param name="nr" select="position()"/> 
      <xsl:with-param name="prefix" select="$pref"/> 
     </xsl:apply-templates> 
     </xsl:for-each> 
    </xsl:if> 
    <xsl:if test="name()!='list'"> 
     <xsl:value-of select="concat(., '&#xA;')"/> 
    </xsl:if> 
    </xsl:template> 
</xsl:transform> 

Der einzige Unterschied zwischen „Ihr“ Ausgang und „Mein“ ist, dass mein Skript druckt auch die Zahl für list Elemente (eigentlich nur Kuchen Zutaten).

Ich dachte, du hättest gerade die Nummer vor dieses Element vergessen.

Beachten Sie auch, dass 2.1. ohne vor sieht unnatürlich aus.