2009-06-18 10 views
2

Was ist die beste Ressource zum Erlernen der Prinzipien, nach denen XSLT Vorlagenregeln anwendet?Ressource Erläuterung des XSLT-Verarbeitungspfads

Fragen wie this scheinen wie sie sollten relativ leicht zu beantworten sein, und sicherlich so nach einigem Studium. Es ist mir fast peinlich, sie zu posten. Aber ich habe Kays XSLT-Programmierreferenz, das XSLT-Kochbuch und Learning XSLT angeschaut, und ich kann immer noch keine klare Erklärung finden, wie ein Knoten und seine Kinder durch eine Reihe von Regeln verarbeitet werden. Vielleicht bin ich ein Idiot, aber ich habe Python, Linux, Apache, MySQL oder Bash nicht für reine Frustration so etwas wie XSLT gefunden.

UPDATE Vielen Dank für Ihre Antworten. Ich werde das für einige Tage nicht mehr abholen können, aber ich schätze die Hilfe.

+0

das ist nicht wirklich eine Antwort ist, aber ich habe das Lernen XSLT gefunden alle über die Praxis ist. Hier finden Sie eine gute XSLT IDE wie Xselerator und einfach weiter versuchen Zeug. –

+1

Ich denke, das Problem m ist nicht XSLT, es ist * die Bücher über XSLT *. – Tomalak

+0

Ich hoffe, dass ich mit meinem Pluralsight-Training ** "XSLT 2.0 and 1.0 Foundations" ** ein tiefgehendes und systematisches Verständnis von XSLT und XPath erhalte. http://pluralsight.com/training/Courses/TableOfContents/xslt-foundations-part1 –

Antwort

3

Die Antworten erklären vor allem, was passiert, wenn Sie Vorlagen definiert haben, aber es ist sehr wichtig, das eingebaute Verhalten von XSLT zu verstehen.

Template-Verarbeitung wird von der XSLT-Engine selbst nicht (im Allgemeinen) von Ihrem Code gesteuert. Auf diese Weise unterscheidet es sich sehr von den von Ihnen erwähnten Verfahrenssprachen. Wenn Sie einen Hintergrund in der funktionalen Programmierung haben, der sehr hilfreich ist.

Das ursprüngliche Verhalten von XSLT ist die Übereinstimmung mit dem Dokumentknoten. Der Dokumentknoten ist ein "imaginärer" Knoten, der als übergeordnetes Element des Stammknotens Ihres XML-Dokuments fungiert. Es repräsentiert das gesamte Dokument. Die Einbau-Verhalten ist effektiv ein xsl: apply-Vorlagen, die wie folgt aussieht:

<xsl:apply-templates select='/|*'/> 

Die XPath-Anweisung entspricht dem documentnode oder ein beliebiges anderes Element. Es stimmt mit dem Stammknoten überein und durchläuft dann Ihr Dokument. Stellen Sie sich das Dokument als Baum vor. An jedem Elementknoten wird genau dieselbe Anweisung ausgeführt. XSLT durchläuft Knoten in einer Reihenfolge von links nach rechts (wenn also Ihr Wurzelelement zwei untergeordnete Elemente hat, trifft es die erste im Dokument vor der zweiten). Da es die Auswahl oben ausführt, wird es dann zu den Kindern dieses Knotens fortschreiten und dasselbe tun. Dies ist eine Tiefen-zuerst-Quer-Traversierung des Baumes von links nach rechts.

Jetzt, an jedem Element Knoten die XSLT-Engine trifft es sucht nach einer passenden Vorlage. Die Regeln sind relativ einfach - sie entscheiden sich dafür, die spezifischste Vorlage auszuführen. Die integrierte Vorlage ist immer die am wenigsten spezifische. Eine Vorlage einen vollständigen Pfad passend ist sehr spezifisch:

<xsl:template match='/some/path/to/a/node'>...</xsl:template>. 

Eine Template-Matching nur ein Knotenname ist weniger spezifisch:

<xsl:template match='node'>...</xsl:template> 

Wenn Sie eine Vorlage definiert haben, dass der Motor wählt (jede Vorlage, die Sie definiert wird anstelle einer integrierten verwendet werden, stoppt die Standard-Traversal oben. Sie führt Ihre Vorlage und stoppt, wenn Ihre Vorlage erneut eine Traversal beginnt:

<xsl:template match='node'> 
    <p><xsl:value-of select='@text'/></p> 
    <xsl:apply-templates/> 
</xsl:template> 

Die apply-templates über unsere Traversal neu startet (btw, apply-templates ohne select-Attribut ist das gleiche wie mit select = ‚‘ *.

ich hoffe, das hilft. das eine dieser Situationen, in denen ein Diagramm, das bestmögliche Ansatz.

+0

Ich habe festgestellt, dass die Arbeit mit den integrierten Vorlagen hilft. Dennoch kann ich nicht finden, eine gute Zuordnung von was XSLT tun kann, wie es tatsächlich tut. Und ich Ich habe im letzten Jahr drei oder vier Wochen damit verbracht. Von den Tools, die ich studiert habe, ist das leicht frustrierend. – chernevik

+0

Ich habe festgestellt, dass ein Hintergrund in der prozeduralen Programmierung ein Problem für sich sein kann, wenn man es versucht xslt zu verstehen - es funktioniert nicht so wie Programmierer es erwarten wenn ich dieses Zeug lehre, haben die Nicht-Programmierer (oder die gelegentlichen funktionalen Programmierer) weniger Probleme mit der Idee, wie alles funktioniert. –

+0

Würde das Studium der funktionalen Programmierung helfen? Welche Ressourcen würden Sie vorschlagen? – chernevik

4

Dieser Abschnitt in der Spezifikation auf XSLT Template Rules ist ziemlich geradlinig und gibt Beispiele.

Denken Sie nicht daran, dass XSLT auf XML wirkt.

Denken Sie an Ihr XML, das durch XSLT fließt.

XSLT beginnt an der Wurzel-Vorlage, mit einem imaginären Cursor auf der Stammebene Ihres Dokument Baum:

<xsl:template match="/"> 
    ...stuff in here... 
</xsl:template> 

In der Mitte, XSLT-Anweisungen ausgeführt wird gestartet. Wenn Sie eine <xsl:apply-templates select="...something..."/> haben, dann findet sie alles an dem Cursor, der mit dem XPath in select = übereinstimmt, und sucht nach Vorlagen mit einer <xsl:template match="...something...">. Der erste, den es findet, wird gemäß den Vorrangregeln ausgeführt.

Während der Ausführung dieser neuen Vorlage gelten die gleichen Dinge, außer dass der Kontext jetzt der übereinstimmende Knoten ist.

Das sind die Grundlagen. So zum Beispiel, wenn Sie das XSLT-Programm haben, dann egal, was die Eingabe, werden Sie <hello world="!"/> als Ausgabe erhalten:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <hello world="!"/> 
    </xsl:template> 
</xsl:stylesheet> 

Aber wenn Sie Eingabe wie folgt aus:

<people> 
    <name>Paige</name> 
    <name>Hayley</name> 
    <name>Hamlet</name> 
</people> 

und Verwenden Sie dies als eine Transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
     <html> 
      <body> 
       <table> 
        <xsl:apply-templates select="/people/name[substring(., 1, 1) = 'H']"/> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
    <xsl:template match="name"> 
     <tr> 
      <td> 
       <xsl:value-of select="."/> 
      </td> 
     </tr> 
    </xsl:template> 
</xsl:stylesheet> 

Es wird zunächst eine HTML-Datei einrichten. Es findet dann alle 'name'-Elemente unter den' people'-Elementen unter dem root-Element, und wenn sie mit dem Buchstaben 'H' beginnen, wird nach einer Vorlage gesucht, die mit 'name' übereinstimmt. Da wir eins haben, wird es eine Tabellenzeile mit dem Namen schreiben. Es wird diese Regel zweimal ausführen, und dann werden die HTML-Elemente geschlossen und das Skript wird beendet.

Hilft das?

+0

Ich verstehe das. Ich komme immer noch nicht zu einer zuverlässigen Reihe von Prinzipien, die vorhersagen, wie dieser Fluss gelenkt wird. – chernevik

+0

Es beginnt immer an der Stammvorlage; Von nun an kommt es auf den Kontext an. Wenn Sie , im Wesentlichen eine Liste aller Knoten, die mit select = übereinstimmen, und diese werden dann nacheinander für alle Vorlagen abgeglichen. Die Übereinstimmung wird auf dem Knoten (Element, @attribute, text(), comment(), processing-instruction(), oder * oder @ * Wildcards), die am ehesten übereinstimmen. "Eng" ist in der Spezifikation als die mit der höchsten Spezifität definiert. – lavinio

+0

@lavinio - "Stellen Sie sich Ihr XML als fließend vor XSLT "- schöne Art und Weise zu betrachten. –

1

Wenn Sie etwas Geld für das Training ausgeben möchten, bietet Ken Holman eine hervorragende Auswahl an XML/XSLT/XPATH/XSL-FO-Kursen.

http://www.cranesoftwrights.com/training/ptux/ptux-video.htm Er verweist auf einige Beispielvideos.

Ich habe seine Trainingseinheiten persönlich besucht. Er ist sehr gründlich und erklärt das Verarbeitungsmodell, Funktionen und Aspekte von XML/XSLT/XPATH. Es ist wichtig zu verstehen, wie die Knotenbäume verarbeitet werden und wie eine XSLT-Engine den Baum "durchläuft".Dann machen XSLT-Vorlagen und die Unterscheidung zwischen "push" und "pull" wirklich Sinn.

XSLT erfordert eine andere Sichtweise. Viele Programmierer tun sich schwer damit, XSLT anzupassen oder zu verstehen, weil sie sich Dinge in Form von prozeduralem Code vorstellen und nicht mehr funktional.