2010-10-14 7 views
11

Ich brauche in den Kommentaren (zum Beispiel)Ausgabeelement in den Kommentaren

<!-- <img src="path" width="100px" height="100px"/> --> 

Ich benutze diesen Ansatz

<?xml version="1.0" encoding="windows-1251"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="no" encoding="windows-1251"/> 

    <xsl:template match="myNode"> 
     ... 
     <xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 
     ... 
    </xsl:template> 

    <xsl:template match="image"> 
     <img src="{@src}" width="{@width}px" height="{@height}px" /> 
    </xsl:template> 

</xsl:stylesheet> 

Als Ergebnis HTML-Element angezeigt werden:

<!----> 

dass ist der Code im Element xsl:comment ignoriert.

Wie zeige ich ein Element in den Kommentaren an?

+0

Gute Frage, +1. Sehen Sie meine Antwort für eine detaillierte Erklärung und drei mögliche Ansätze, abhängig von der spezifischen Aufgabe. –

+0

Ich habe gerade meine Antwort bearbeitet und denke, dass sie jetzt die gewünschte Lösung hat. Ist das so? –

Antwort

10

Es könnte möglich sein

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment>

mit

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text>
<xsl:apply-templates select="image" />
<xsl:text disable-output-escaping="yes">--&gt;</xsl:text>

Haben zu ersetzen allerdings nicht versucht.

1

Von http://www.w3.org/TR/xslt#section-Creating-Comments:

Das xsl: Kommentar Element instanziiert einen Kommentarknoten im Ergebnisbaum zu erstellen. Der Inhalt des Elements xsl: comment ist eine Vorlage für den String-Wert des Kommentarknotens.

Zum Beispiel diese

<xsl:comment>This file is automatically generated. Do not edit!</xsl:comment>

Kommentar

<!--This file is automatically generated. Do not edit!-->

Es ist ein Fehler erzeugen würde, wenn die Inhalt von xsl Instanziierung: Kommentar Knoten andere schafft als Textknoten. Ein XSLT Prozessor kann den Fehler signalisieren; Wenn es nicht den Fehler signalisiert, muss es wiederherstellen, indem Sie die störenden Knoten zusammen mit ihrem Inhalt ignorieren.

Es ist ein Fehler, wenn das Ergebnis von den Inhalt des xsl Instanziierung: Kommentar enthält die Zeichenfolge -- oder mit - endet. Ein XSLT-Prozessor kann den Fehler signalisieren; Wenn es nicht Signal der Fehler ist, muss es durch Wiederherstellung ein Leerzeichen nach jedem Auftreten von -, die von einem anderen - oder gefolgt wird, die den Kommentar beendet.

Also, um zu tun, was Sie wollen, müssen Sie DOE-Mechanismus verwenden.

Als Beispiel dieses Sheet:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl"> 
    <xsl:output method="html" indent="no" encoding="windows-1251"/> 
    <xsl:template match="img"> 
     <img src="{.}"/> 
    </xsl:template> 
    <xsl:template match="root"> 
     <xsl:variable name="vResult"> 
      <xsl:apply-templates/> 
     </xsl:variable> 
     <html> 
      <xsl:copy-of select="$vResult"/> 
      <xsl:comment> 
       <xsl:apply-templates select="msxsl:node-set($vResult)" 
            mode="encode"/> 
      </xsl:comment> 
     </html> 
    </xsl:template> 
    <xsl:template match="*" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>></xsl:text> 
     <xsl:apply-templates mode="encode"/> 
     <xsl:value-of select="concat('&lt;',name(),'>')" 
         disable-output-escaping="yes"/> 
    </xsl:template> 
    <xsl:template match="*[not(node())]" mode="encode"> 
     <xsl:value-of select="concat('&lt;',name())" 
         disable-output-escaping="yes"/> 
     <xsl:apply-templates select="@*" mode="encode"/> 
     <xsl:text>/></xsl:text> 
    </xsl:template> 
    <xsl:template match="@*" mode="encode"> 
     <xsl:value-of select="concat(' ',name(),'=&quot;',.,'&quot;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

Mit diesem Eingang:

<root> 
    <img>http://example.org/image1.jpg</img> 
    <img>http://example.org/image2.jpg</img> 
    <img>http://example.org/image3.jpg</img> 
</root> 

Output:

<html> 
    <img src="http://example.org/image1.jpg"> 
    <img src="http://example.org/image2.jpg"> 
    <img src="http://example.org/image3.jpg"> 
    <!--<img src="http://example.org/image1.jpg"/> 
     <img src="http://example.org/image2.jpg"/> 
     <img src="http://example.org/image3.jpg"/>--> 
</html> 

Hinweis: node-set Erweiterungsfunktion für zwei Pass-Transformation. disable-output-escaping Attribut für xsl:value-of Anweisung.

+0

@ Alejandro: Ich kann 'node-set' nicht in unserem Projekt verwenden (ich habe keine Möglichkeit, diese Funktion zu aktivieren) – Kalinin

+0

@Kalinin: Die Verwendung der' node-set'-Erweiterungsfunktion ist eine Transformation mit zwei Durchgängen, es geht nicht darum Sie benötigen: Deaktivieren des Ausgabe-Escaping, so dass '<' Zeichen nicht als Entity-Referenz ausgegeben wird '<'. Natürlich, wenn Sie keine Two-Pass-Transformation verwenden, müssen Sie die Contente-Vorlage für Ihre "Pseudoelemente" auf die gleiche Weise wie in diesem Modus "Encodieren" Vorlagen erstellen. Außerdem bin ich sicher, dass Ihr Prozessor die 'node-set'-Erweiterungsfunktion hat, aber unter einem anderen Namensraum. Welchen XSLT-Prozessor verwenden Sie? –

7
<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

Als Ergebnis:

<!----> 

, dass der Code in dem Element xsl: Kommentar ignoriert

The XSLT 1.0 Spec sagt:

Es ist ein Fehler beim Instanziieren des Inhalts von xsl: comment erstellt Knoten andere als Textknoten. Ein XSLT Prozessor kann den Fehler signalisieren; Wenn es nicht den Fehler signalisiert, muss es wiederherstellen, indem Sie die störenden Knoten zusammen mit ihrem Inhalt ignorieren.

Wie zeige ich einen Artikel in den Kommentaren?

Es hängt davon ab, was für "Anzeige" zu verstehen ist: in einem Browser:

&lt;-- <xsl:apply-templates select="image" /> --> 

nützlich sein kann, sofern das Ergebnis der <xsl:apply-templates/> aboveis nur einfachen Text (nicht Markup).

Wenn auf "Anzeige" das Ergebnis zu liefern, wie Text, dann DOE, wenn durch den XSLT-Prozessor erlaubt, uns das gewünschte Ergebnis geben kann:

< - Einiger Text - >

Schließlich, wenn es erforderlich ist, dass was innerhalb des "Kommentars" sollte Markup sein und es sollte als Markup angezeigt werden, dann ist das ziemlich schwierig. In diesem Fall ist eine verwenden hat:

<xsl:output method="text"/> 

und soll jede XML lexikalische Einheit mit seiner gewünschten Serialisierung vorhanden ist (d.h. entkommen).

So erstellt der XPath Visualizer seine Ausgabe.

Hier ist eine kleine Veränderung, die die ersten beiden Ansätze zeigt:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
     &lt;-- Hello, World --> 

    <xsl:text disable-output-escaping="yes">&lt;--</xsl:text> 
    Hello,world! --<xsl:text disable-output-escaping="yes">&gt;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

diese Transformation, wenn produziert auf jedem XML-Dokument (nicht benutzt) angewendet:

 &lt;-- Hello, World --&gt; 

    <-- 
    Hello,world! --> 

Beide "Kommentare" können als Kommentare in einem Browser angezeigt werden, während nur die zweite als Kommentar im Freitext dargestellt wird.

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    &lt;-- <xsl:apply-templates select="image"/> --> 

</xsl:template> 

<xsl:template match="image"> 
    &lt;img src="<xsl:value-of select="@src"/>" 
     width="<xsl:value-of select="@width"/>px" 
     height="<xsl:value-of select="@height"/>px"/> 
</xsl:template> 
</xsl:stylesheet> 

wenn diese Transformation auf das folgende XML-Dokument angewendet wird:

Der dritte Ansatz (höchstwahrscheinlich, was Sie wollen) unter dargestellt

<image src="http://example.com/yyy.jpg" width="200" height="300"/> 

das wollte Ergebnis wird erzeugt:

&lt;-- 
    &lt;img src="http://example.com/yyy.jpg" 
     width="200px" 
     height="300px"/&gt; 
    --&gt; 

in einem Browser als:

< - < img src = "http://example.com/yyy.jpg" width = "200px" height = "300px"/> - >

0

Wie bereits von Dimitri erwähnt, können Sie die Anweisung xsl: comment nicht verwenden.

Wenn Ihr Ziel ist es einfach ein Fragment von Baum zu kommentieren, ist der einfachste Weg, um die Kommentare Marker als Text (unescaped) wie folgt zu setzen:

<xsl:text disable-output-escaping="yes">&lt;!--</xsl:text><xsl:apply-templates select="image" /><xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 

statt:

<xsl:comment><xsl:apply-templates select="image" /></xsl:comment> 

und Sie erhalten genau diese

<!-- <img src="path" width="100px" height="100px"/> --> 

verwendet mit MSXML und saxon

+0

Ich sehe nicht, wie diese Antwort von http://stackoverflow.com/a/3933175/272735 unterscheidet – user272735

Verwandte Themen