Übereinstimmenden child-Elemente in XSL
Dachte ich, sah ich einen Fehler in einer Antwort auf diese Frage, und zeigte es. Mir wurde gesagt, ich war falsch, und meine Antwort wurde später gelöscht.
Dennoch sehe ich nicht, wie ich falsch war. Deshalb bin ich hier veröffentlichen und hoffe jemand kann erklären, mein Missverständnis zu mir.
Die Antwort, die ich beantwortet erklärt, die Verwendung von apply-templates. Es enthielt die folgenden XML-und XSL beschreibt, wie die Vorlagen übereinstimmen würde:
<!-- sample XML snippet -->
<xml>
<foo /><bar /><baz />
</xml>
<!-- sample XSLT snippet -->
<xsl:template match="xml">
<xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>
<xsl:template match="foo"> <!-- will be called once -->
<xsl:text>foo element encountered</xsl:text>
</xsl:template>
<xsl:template match="xml/*"> <!-- will be called twice -->
<xsl:text>other element countered</xsl:text>
</xsl:template>
Mein Kommentar war, dass die Letzte Vorlage sein sollte:
<xsl:template match="*"> <!-- will be called twice -->
<xsl:text>other element countered</xsl:text>
</xsl:template>
weil der aktuelle Knoten bereits <xml>
Mir wurde gesagt:
Nein, xml/* ist ein Muster, das entspricht untergeordneten Elemente eines Elements mit
die Namen xml.
Prüfung der ursprüngliche Antwort
Jedoch mit dieser XML:
<xml>
<foo /><bar /><baz />
</xml>
Und das XSL-stylesheet (ausfüllen der snippet oben):
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="xml">
<xsl:apply-templates select="*" /> <!-- three nodes selected here -->
</xsl:template>
<xsl:template match="foo"> <!-- will be called once -->
<xsl:text>foo element encountered.
</xsl:text>
</xsl:template>
<xsl:template match="xml/*"> <!-- will be called twice -->
<xsl:text>other element countered.
</xsl:text>
</xsl:template>
</xsl:stylesheet>
Bekomme ich:
other element countered.
other element countered.
other element countered.
Meine Prüfung 'korrigierte' version
Wenn ich ersetzen Sie die Letzte Vorlage mit:
<xsl:template match="*"> <!-- will be called twice -->
<xsl:text>other element countered.
</xsl:text>
</xsl:template>
als pro meine Antwort, die ich bekomme:
foo element encountered.
other element countered.
other element countered.
denen erscheinen würde, um korrekt zu sein.
Ich hoffe, dass meine Frage nicht zu brechen alle Richtlinien, aber ich kann nicht sehen, dass ich falsch bin und bin in der Hoffnung, jemand kann es erklären, mehr voll.
PS. Ich fürchte, dass meine ursprüngliche Antwort auf der anderen Frage wurde geschrieben als Antwort, kein Kommentar, wie ich habe nicht genug Punkte, um Kommentare zu schreiben noch. Ich war nicht sicher, was das beste, was zu tun war...
- Vielen Dank für die Feststellung, dass die dummen Fehler von mir, es ist jetzt behoben in dem anderen thread. Das ging unbemerkt von allen anderen, schaute sich die Antwort im Laufe der Jahre.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist korrekt, nach der Regeln über die Standard-Priorität-Vorlagen. Ein template-matching
foo
hat default-Priorität 0, eine passende*
hat Standard-Priorität -0.5, aber eine passendexml/*
hat Standard-Priorität 0.5. Diexml/*
Vorlage wird als spezifischer als diefoo
ein, so dass es gewinnt, wenn entweder übereinstimmen könnte.Also du hattest Recht, dass die template match-expression erforderlich zu sein
*
eher alsxml/*
, aber nicht aus dem richtigen Grund - einxml/*
Vorlage kann match für eineapply-templates select="*"
wenn der aktuelle Knotenxml
, und es gelten für jede der selektierten Elemente (denn Sie sind alle Kinder vonxml
), außer wo gibt es eine andere Vorlage mit einer explizitenpriority
größer als 0,5, kann Vorrang haben.Ich war die person, die sagte, Sie waren falsch, in den anderen thread, und nach einem Blick auf die Frage genauer, ich kann sehen, dass Sie richtig waren auf den Hinweis, dass Tomalak einen Fehler gemacht, aber nicht für die Gründe, die Sie gab (wenn ich verstehen Ihren Kommentar nicht richtig).
match="xml/*"
hat match untergeordneten Knoten des<xml>
element, ob der aktuelle Kontext war die<xml>
Knoten, wennapply-templates
genannt wurde. In einemmatch=""
Ausdruck, der "current node" ist der Knoten, auf die templates angewendet werden, nicht der Kontext, in demapply-templates
aufgerufen wurde, so dass in diesem template der aktuelle Knoten wärefoo
,bar
, undbaz
. Beobachten Sie von Ihrem eigenen Experimentieren vor, dassxml/*
erfolgreich in übereinstimmenden child-Elemente vonxml
, aber in der Tat entspricht Sie mehr als Tomalak sagt, es wird.Das problem mit
match="xml/*"
ist, dass es zu bestimmten und hat die entgegengesetzte Wirkung von dem, was ich denke Tomalak soll. Es scheint, er hat gemeint das dies eine catch-all für Kinder vonxml
waren nicht aufeinander abgestimmt sind ansonsten aber als Ian Roberts erklärt, diese Vorlage windet sich mit höher Priorität als diefoo
Vorlage, und fängt alle Kinder derxml
Knoten.Ich weiß, es ist frustrierend, gerade jetzt nicht in der Lage Kommentare zu schreiben Ihre eigenen, aber bald genug werden Sie. Und ist es akzeptabel, zu erstellen Sie Ihre eigene Frage, die zu stellen Sie eine Frage zu einem anderen thread. Man darf nur keine erstellen, die Antworten zu kommentieren, andere Antworten.