Verwendung einer HTML-Entität in XSLT (z. B.)
-
09-06-2019 - |
Frage
Was ist der beste Weg, eine HTML-Entität in XSLT einzubinden?
<xsl:template match="/a/node">
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
dieser gibt a zurück XsltParseError
Lösung
Sie können den CDATA-Abschnitt verwenden
<xsl:text disable-output-escaping="yes"><![CDATA[ ]]></xsl:text>
oder Sie können   in der lokalen DTD beschreiben:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
oder einfach nutzen  
anstatt
Andere Tipps
Es ist auch möglich, den Ansatz ab dem 2. Teil zu erweitern Akus Antwort und holen Sie sich alle bekannten Charakterreferenzen wie folgt:
<!DOCTYPE stylesheet [
<!ENTITY % w3centities-f PUBLIC "-//W3C//ENTITIES Combined Set//EN//XML"
"http://www.w3.org/2003/entities/2007/w3centities-f.ent">
%w3centities-f;
]>
...
<xsl:text> −30°</xsl:text>
Es gibt gewisse Unterschiede im Ergebnis im Vergleich zu <xsl:text disable-output-escaping="yes">
Ansatz.Letzteres wird String-Literale wie erzeugen
für alle Arten von Ausgaben, auch für <xsl:output method="text">
, und dies kann anders sein, als Sie es sich wünschen ...Im Gegenteil, das Abrufen von für die XSLT-Vorlage definierten Entitäten über <!DOCTYPE ... <!ENTITY ...
wird immer eine Ausgabe erzeugen, die mit Ihrer übereinstimmt xsl:output
Einstellungen.
Dann kann es sinnvoll sein, einen lokalen Entity-Resolver zu verwenden, um zu verhindern, dass die XSLT-Engine Zeichen-Entity-Definitionen aus dem Internet abruft.JAXP- oder explizite Xalan-J-Benutzer benötigen möglicherweise einen Patch für Xalan-J, um den Resolver korrekt zu verwenden.Siehe meinen Blog XSLT, Entitäten, Java, Xalan... für Patch-Downloads und Kommentare.
Eine weitere Möglichkeit, HTML-Entitäten innerhalb von XSLT zu verwenden, ist die folgende:
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
XSLT verarbeitet standardmäßig nur die fünf Grundentitäten: lt
, gt
, apos
, quot
, Und amp
.Alle anderen müssen als definiert werden @Aku Erwähnungen.
dieser gibt a zurück XsltParseError
Ja, und der Grund dafür ist dieser
ist in XML oder XSLT keine vordefinierte Entität wie in HTML.
Sie könnten einfach das Unicode-Zeichen verwenden, das
steht für:  
Da es nun Unicode gibt, ist es im Allgemeinen kontraproduktiv, benannte Zeichenentitäten zu verwenden.Aus diesem Grund würde ich empfehlen, das Unicode-Zeichen für ein geschütztes Leerzeichen anstelle einer Entität zu verwenden.Alternativ können Sie die Entität verwenden  
;, anstelle der benannten Entität.Durch die Verwendung benannter Entitäten ist Ihr XML von einer Inline- oder externen DTD abhängig.
Ich habe festgestellt, dass alle diese Lösungen ein Â-Zeichen im Leerzeichen erzeugten.
Benutzen <xsl:text> </xsl:text>
hat das Problem für mich gelöst;Aber <xsl:text>#x20;</xsl:text>
könnte auch funktionieren.
Danke für Ihre Information.Ich habe einen kurzen Blog-Beitrag geschrieben, der auf dem basiert, was für mich funktioniert hat, als ich die XSLT-Transformation in einer Vorlage von durchgeführt habe Dynamicweb CMS.
Der Blogbeitrag ist hier: So fügen Sie Entitäten zu XSLT-Vorlagen hinzu.
/Sten Hougaard
Es ist notwendig, die Entität zu verwenden #x160;
Mit dem DOCTYPE-Ansatz von Aku hatte ich kein Glück.
Was bei mir bei MSXML-Transformationen auf einem Windows 2003-Server funktioniert hat, war
<xsl:text disable-output-escaping="yes">&#160;</xsl:text>
Eine Art Hybrid aus dem oben Gesagten.Vielen Dank an die Stackoverflow-Mitwirkenden!
Ein Leerzeichen zwischen Text-Tags sollte ausreichen.