Warum hat der frühere Code TEXT ausgegeben, warum sollte ich darauf bestehen, dass XSL den gesamten anderen Text ignoriert? ist, dass das Verhalten aller XML-Parser oder nur meiner eigenen
Sie entdecken eine der grundlegendsten XSLT-Funktionen, die in der Spezifikation angegeben sind: die integrierten Vorlagen von XSLT .
Aus der Spezifikation :
Es gibt eine integrierte Vorlagenregel, mit der die rekursive Verarbeitung fortgesetzt werden kann, wenn keine erfolgreiche Musterübereinstimmung durch eine explizite Vorlagenregel im Stylesheet erfolgt. Diese Vorlagenregel gilt sowohl für Elementknoten als auch für den Stammknoten. Das Folgende zeigt das Äquivalent der integrierten Vorlagenregel:
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Es gibt auch eine integrierte Vorlagenregel für jeden Modus, mit der die rekursive Verarbeitung im selben Modus fortgesetzt werden kann, wenn keine erfolgreiche Musterübereinstimmung durch eine explizite Vorlagenregel im Stylesheet erfolgt. Diese Vorlagenregel gilt sowohl für Elementknoten als auch für den Stammknoten. Das Folgende zeigt das Äquivalent der integrierten Vorlagenregel für Modus m.
<xsl:template match="*|/" mode="m">
<xsl:apply-templates mode="m"/>
</xsl:template>
Es gibt auch eine integrierte Vorlagenregel für Text- und Attributknoten, mit der Text kopiert wird:
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
Die integrierte Vorlagenregel für die Verarbeitung von Anweisungen und Kommentaren lautet, nichts zu tun.
<xsl:template match="processing-instruction()|comment()"/>
Die integrierte Vorlagenregel für Namespace-Knoten lautet auch, nichts zu tun. Es gibt kein Muster, das mit einem Namespace-Knoten übereinstimmen kann. Daher ist die integrierte Vorlagenregel die einzige Vorlagenregel, die für Namespace-Knoten angewendet wird.
Die integrierten Vorlagenregeln werden so behandelt, als ob sie implizit vor dem Stylesheet importiert wurden, und haben daher eine niedrigere Importpriorität als alle anderen Vorlagenregeln. Auf diese Weise kann der Autor eine integrierte Vorlagenregel überschreiben, indem er eine explizite Vorlagenregel einfügt.
Das gemeldete Verhalten ist also das Ergebnis der Anwendung der integrierten Vorlagen - der 1. und 2. von allen drei.
Es ist ein gutes XSLT-Entwurfsmuster, die integrierten Vorlagen mit Ihren eigenen zu überschreiben, die bei jedem Aufruf eine Fehlermeldung ausgeben, damit der Programmierer sofort weiß, dass seine Transformation "undicht" ist:
Wenn beispielsweise dieses XML-Dokument vorhanden ist:
<a>
<b>
<c>Don't want to see this</c>
</b>
</a>
und es wird mit dieser Transformation verarbeitet :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="a|b">
<xsl:copy>
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Das Ergebnis ist :
<a name="a">
<b name="b">Don't want to see this</b>
</a>
und der Programmierer wird sehr verwirrt sein, wie der unerwünschte Text erschien.
Wenn Sie dies jedoch nur hinzufügen catch-all template
, können Sie solche Verwirrungen vermeiden und Fehler sofort erkennen :
<xsl:template match="*">
<xsl:message terminate="no">
WARNING: Unmatched element: <xsl:value-of select="name()"/>
</xsl:message>
<xsl:apply-templates/>
</xsl:template>
Neben der verwirrenden Ausgabe erhält der Programmierer nun eine Warnung, die das Problem sofort erklärt :
WARNING: Unmatched element: c
Späterer Zusatz von Michael Kay für XSLT 3.0
In XSLT 3.0 können Sie das Fallback-Verhalten für eine xsl:mode
Deklaration angeben, anstatt eine Sammelvorlagenregel hinzuzufügen . <xsl:mode on-no-match="shallow-skip"/>
Verursacht beispielsweise, dass alle nicht übereinstimmenden Knoten (einschließlich Textknoten) übersprungen werden, während <xsl:mode on-no-match="fail"/>
eine Nichtübereinstimmung als Fehler behandelt wird und <xsl:mode warning-on-no-match="true"/>
eine Warnung ausgegeben wird.