2016-08-07 47 views
1

Ich bin wirklich neu in XSLT und ich habe Schwierigkeiten, einige Codes zu verstehen. Im Anschluss ist der Code, den ich nicht verstehe:XSLT "match" und "if" bedeutet

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

und:

<xsl:if test="*"> 

Was bedeutet es, wenn Sie ein Symbol * testen?

+0

Es ist ein Wildcard - alles passen. – OldProgrammer

+2

Der erste Code ist die Identity-Transformationsvorlage, die zum Kopieren aller Knoten und Attribute verwendet wird, die in der Eingabe vorhanden sind. Es gibt zahlreiche Fragen zu den gleichen auf Stackoverflow, können Sie einige durchgehen, um zu verstehen, wie es funktioniert. Die zweite ist ein Test auf dem aktuellen Knoten, um zu überprüfen, ob er irgendwelche Kindelemente hat (nur Elemente und nicht "irgendetwas"); Wenn ja, wird das 'xsl: if' eingegeben, sonst nicht. –

+0

Wie nähern Sie sich der Aufgabe, sich die Sprache beizubringen? Wenn du ein Konstrukt suchst, das du noch nie gesehen hast, ist das nicht der effizienteste Ansatz. Ich mag altmodisch sein, aber wenn ich eine neue Sprache anwende, ist das erste, was ich tue, ein Buch mit einem guten Index zu ergattern und ein paar Abende damit zu verbringen, es zu lesen, bevor ich versuche, irgendeinen Code zu schreiben. –

Antwort

2

Die erste Vorlage ist die Basis für eine identity transform, und oft als Grundlage für ein "Push-Stil" Stylesheet verwendet, in dem das Standardverhalten ist, einfach die Eingabe in die Ausgabe zu kopieren. Es werden spezifischere Vorlagen hinzugefügt, um das Verhalten anzupassen und unterschiedliche Inhalte zu erstellen.

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

wird diese Vorlage @* und beliebigen Knoten (Element, den Kommentar, Text oder Verarbeitungsbefehl) node(), beliebige Attribute übereinstimmen und ist eine Abkürzung für: *|comment()|text()|processing-instruction()

Wenn eines dieser Elemente angepaßt sind, um die Vorlage kopiert zuerst das übereinstimmende Element und ruft anschließend xsl:apply-templates für alle Attribute oder node() Child des Kontextelements auf. Im Falle eines Attributs text(), comment() oder processing-instruction() gibt es keine Attribute oder untergeordnete Elemente node(). Für ein Element könnte es beide dieser Dinge entsprechen. Wenn keine spezifischere Vorlage vorhanden ist, wird diese einfach mit dieser Vorlage abgeglichen und das übereinstimmende Element kopiert und die Verarbeitung der Attribute und untergeordneten Elemente (falls vorhanden) fortgesetzt.

Im Fall der xsl:if:

<xsl:if test="*"> 

zu sehen, dass prüft, ob es irgendwelche Kind-Elemente sind (relative aus dem Kontext-Knoten). Wenn es welche gibt, ist die Bedingung erfüllt und der Test wird zu true() ausgewertet und was auch immer in das if eingefügt wird, wird angewendet.

Weitere Informationen über die abgekürzte Syntax finden Sie in der Spezifikation: https://www.w3.org/TR/xpath/#path-abbrev