2016-08-14 1 views
0

Dies ist eine gültige XPath 2.0:durch Komma getrennte Liste von Ausdrücken für sich selbst und folgende Geschwister in XPath funktioniert, aber nicht als XSLT Einstimmungsmuster

//hi[@rend="bold"]/(self::hi, following-sibling::*, following-sibling::text()) 

Es alle hallo Knoten mit dem angegebenen Attribut auswählen sowie alle Geschwisterelement- und Textknoten.

Wenn ich jedoch versuchen, diese XPath zu verwenden, in XSLT 2.0 wie folgt aus:

<xsl:template match="hi[@rend='bold']/(self::hi, following-sibling::*, following-sibling::text())"> 
     <!--do something--> 
    </xsl:template> 

ich einen Syntaxfehler zu bekommen. Warum das? Wie kann ich dieses passende Muster so umschreiben, dass es in XSLT funktioniert?

Ziel ist es, alle oben genannten Elemente in ein neues Element zu integrieren.

All the best, Tench

+1

"Das Ziel ist es, alle oben genannten in ein neues Element zu verpacken." klingt so als ob eine '" könnte in XSLT 2.0 ein anderer Ansatz sein, um das Problem zu lösen. Aber es ist schwer zu sagen, ohne die Eingabe-XML und das gewünschte Ergebnis zu sehen. –

Antwort

0

Dies ist, wie ich das oben zu lösen verwaltet:

<xsl:template match="hi[@rend='bold']"> 
     <xsl:element name="wrap"> 
     <xsl:element name="hi"> 
      <xsl:attribute name="rend">bold</xsl:attribute> 
      <xsl:value-of select="."/> 
     </xsl:element> 
     <xsl:copy-of select="following-sibling::node()"></xsl:copy-of> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="node()[preceding-sibling::hi[@rend='bold']]"></xsl:template> 

Grundsätzlich passen wir das hallo Element zunächst, wickeln und kopieren Sie den folgenden Knoten; und in einem separaten Muster passen wir die Knoten an, die das bestimmte hi-Element als ihr vorhergehendes Geschwister haben, so dass ihr Inhalt nicht zweimal in der Ausgabe erscheint.

Eine wichtige Lektion gelernt: Sie können nicht einfach xPath nehmen und es in Ihrem XSLT stecken.

+0

Es scheint mir, dass der Inhalt Ihrer ersten Vorlage vereinfacht werden könnte ''. –

1

ich einen Syntaxfehler zu bekommen. Warum das?

Ein XSLT Einstimmungsmuster hat syntax rules seiner eigenen. Nur eine Teilmenge der gültigen XPath-Ausdrücke sind ebenfalls gültige Übereinstimmungsmuster.

Wie kann ich dieses passende Muster so umschreiben, dass es in XSLT funktioniert?

Aus der Spitze von meinem Kopf:

<xsl:template match="hi[@rend='bold'] | *[preceding-sibling::hi[@rend='bold']] | text()[preceding-sibling::hi[@rend='bold']]"> 

Es kann ein eleganter Weg, um es auszudrücken, aber ich glaube, dass es das tut, was Sie sagen, Sie tun wollen.

+0

Danke, Michael.Das hat bei mir wahrscheinlich nicht funktioniert, weil ich immer noch alle zusammen genommen haben musste, um sie in einem Element zu verpacken. Ich bin mir nicht wirklich sicher. Danke trotzdem. Ich habe es geschafft, eine Lösung zu finden und habe sie hier gepostet. – Tench

+0

"* ... musste alle zusammen genommen werden, um sie in ein Element zu bringen. *" Nun, dann hätte es nicht für dich funktioniert, selbst wenn dein ursprünglicher Versuch ein gültiges Übereinstimmungsmuster wäre. Ich habe das irgendwie vermutet - deshalb habe ich gesagt: "Ich glaube, es macht das, was du gesagt hast, was du tun wolltest". –

+0

ja. Danke, dass du es aufgezeigt hast. – Tench

2

Ich war manchmal in der Position, wo ich eine Vorlage Regel auf Knoten durch ein komplexes Muster wie folgt anwenden möchten, und die beste Lösung war, eine globale Variable an alle relevanten Knoten zu binden und dann die verwenden globale Variable im Muster:

<xsl:variable name="afterBold" 
    select="//hi[@rend="bold"]/ 
    (self::hi, following-sibling::*, following-sibling::text())"/> 

<xsl:template match="node()[. intersect $afterBold]"/> 

Das obige erfordert XSLT 2.0. In XSLT 3.0 kann es vereinfacht werden:

<xsl:template match="$afterBold"/> 
Verwandte Themen