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, '
')"/>
<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(., '
')"/>
</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.
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
Möchten Sie eigentlich nur Text hier ausgeben? Oder versuchen Sie tatsächlich HTML auszugeben? –
@TimC Ich möchte den Text ausgeben – fredjohnson