Verwenden Sie  stattdessen den Entitätscode .
ist eine HTML "Zeichenentitätsreferenz". Es gibt keine benannte Entität für nicht unterbrechenden Speicherplatz in XML, daher verwenden Sie den Code  .
Wir sind kürzlich in eine Situation geraten, in der nur einer von vielen XSL aufgehört hat, mit dieser Technik zu arbeiten, und einen seltsamen Charakter gezeigt hat. Wenn ich jedoch die CDATA-Technik von WaterSoul verwende, funktioniert dies.
@BrianReindel, das bedeutet wahrscheinlich, dass Sie die falsche numerische Entitätsreferenz verwendet haben, dh Šanstelle  der letzteren, die immer in einen Unicode-Leerzeichen ohne Unterbrechung aufgelöst wird.
<xsl: text> & # 160; </ xsl: text> es trennt die beiden Felder
Manash Ranjan Dakua
1
Die Verbindung ist verfault.
GSerg
37
 funktioniert wirklich gut. Es wird jedoch eines dieser seltsamen Zeichen in der ANSI-Codierung angezeigt. <xsl:text>hat am besten für mich funktioniert.
Bei Verwendung der akzeptierten Antwort wurde in meiner XML-Ausgabe ein Zeilenumbruch angezeigt (zumindest sah dies im XML-Editor von VS2010 so aus). Mit dieser Antwort bekomme ich genau 1 Leerzeichen.
Mathijs Flietstra
1
@Matthijs, dies ist ein Raum, kein nicht brechender Raum, der nicht derselbe ist. Wenn VS es falsch anzeigt, überprüfen Sie Ihre Codierung (VS ist perfekt in der Lage, dies korrekt anzuzeigen, und es sollte unabhängig von der Codierung sein, sodass Sie mit größerer Wahrscheinlichkeit etwas anderes falsch gemacht haben).
Dies funktioniert, wenn der Prozessor unterstütztdisable-output-escaping , was nicht erforderlich ist und in XSLT 2.0 und mehr noch in 3.0 veraltet war. In diesen Versionen können Sie den gleichen Effekt erzielen, wenn Sie xsl:character-mapgarantiert prozessorübergreifend arbeiten. Außerdem wird dadurch eine benannte Entität in die Ausgabe eingefügt, die nicht unbedingt mit einem nicht unterbrechenden Leerzeichen identisch ist, und auf der Empfangsseite muss diese Entität deklariert sein (in HTML ist dies normalerweise implizit).
Ich bin mir nicht sicher, aber ich habe meinen Ansatz getestet und er funktioniert, daher bin ich mir nicht sicher, wofür die Ablehnung war :(
jagprinderdeep
2
Außerdem ist die akzeptierte Antwort nicht für alle Parser gemäß der verlinkten Seite gültig. nur ein Kopf hoch
jagprinderdeep
1
Ich habe den Grund für meine Ablehnung bereits angegeben, aber wenn ich diese Antwort ablehnen würde, wäre der Grund - sie beantwortet die falsche Frage. Das OP hat klar gefragt, wie mit xslt ein nicht zerbrechlicher Speicherplatz eingefügt werden soll, und Sie haben geantwortet, wie eine kaufmännische Und-nbsp-Semikolon-Sequenz eingefügt werden soll. Und es ist auch unnötig, sich über Abstimmungen zu streiten. Aber im Ernst, haben Sie das noch nie über CDATA gesagt?
Michael Krelin - Hacker
1
Okay, jagprinderdeep, ich widerrufe meine Ablehnung, aber im Gegenzug besuchen Sie mich bitte, sobald ich in die Irrenanstalt gekommen bin. (Beachten Sie, dass ich Ihnen aus diesem neuen Grund keine Ablehnung gebe). Aber verstehe, dass du die falsche Frage beantwortest. Ich denke, das war genau der Grund für die andere Ablehnung.
Michael Krelin - Hacker
8
Ich habe auch abgelehnt, da Sie nicht garantieren können, dass das empfangende Ende deklariert. Wenn Sie mit xslt + html arbeiten, dann ist dies eine Möglichkeit, wenn auch ein Hack. Aber wenn Sie xslt verwenden, um andere XML-Dateien zu generieren, wird es Sie einfach in die Luft jagen.
Doug
14
Möglicherweise möchten Sie die Definition für diese Entität am Anfang der Datei hinzufügen (unter der XML-Deklaration):
Es gibt auch einen gewissen Unterschied im Ergebnis dieses Ansatzes im Vergleich zu <xsl:text disable-output-escaping="yes">einem. Letzteres wird String-Literale erzeugen, wie für alle Arten von Ausgaben, auch für <xsl:output method="text">, und dies kann sich von dem unterscheiden, was Sie vielleicht wünschen ... Im Gegenteil, wenn Entitäten für XSLT-Vorlagen über definiert werden, <!DOCTYPE ... <!ENTITY ...wird immer eine Ausgabe erzeugt, die mit übereinstimmt Ihrexsl:output Einstellungen.
Wenn alle Zeichenreferenzen eingeschlossen sind, kann es sinnvoll sein, einen lokalen Entitätsauflöser zu verwenden, um zu verhindern, dass die XSLT-Engine Zeichenentitätsdefinitionen 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. In meinem Blog XSLT, Entities, Java, Xalan ... finden Sie Patch-Download und Kommentare.
Beachten Sie, dass W3 kürzlich damit begonnen hat, zu viele Anforderungen an diese und ähnliche Links zu blockieren, wenn diese aus einem automatisierten Prozess stammen. Platzieren Sie diese Datei lokal oder auf Ihrem Server und passen Sie die URL entsprechend an. Es sollte Ihnen gut gehen. Davon abgesehen +1 und eine hervorragende Lösung für die Verwendung von HTML-benannten Entitäten.
Abel
Ein guter Hinweis, und es gibt noch einen weiteren Grund, eine lokale Kopie der Datei mit Entitätsdefinitionen zu haben, da sonst der XSLT-Prozess wahrscheinlich fehlschlägt, wenn keine Internetverbindung verfügbar ist. In der Java-Welt müssen URLs nicht gehackt werden, da ein EntityResolver arrangiert werden kann und Apache XML Commons Resolver möglicherweise ein guter Kandidat ist. Andere Programmierplattformen haben wahrscheinlich auch ähnliche Techniken ...
Sie brauchen nicht disable-output-escapingfür diese
Ian Roberts
2
XSLT- Stylesheets müssen aus wohlgeformtem XML bestehen. Da " "es sich nicht um eine der fünf vordefinierten XML-Entitäten handelt , kann es nicht direkt in das Stylesheet aufgenommen werden. Die Rückkehr zu Ihrer Lösung " "ist also ein perfekter Ersatz, den " "Sie verwenden sollten.
Dies wird ausgegeben &nbsp;(vorausgesetzt, Sie wollten ein Semikolon verwenden), das als und nicht als `` (nb-Leerzeichen) gerendert wird.
Abel
0
Ich habe versucht, Rahmen für eine leere Zelle in einer HTML-Tabelle anzuzeigen. Mein alter Trick, nicht unterbrechenden Speicherplatz in leeren Zellen zu verwenden, funktionierte nicht mit xslt. Ich habe Zeilenumbruch mit dem gleichen Effekt verwendet. Ich erwähne dies nur für den Fall, dass der Grund, warum Sie versucht haben, den nicht unterbrechenden Bereich zu verwenden, darin bestand, einer "leeren" Tabellenzelle Inhalt zu geben, um die Zellränder zu aktivieren.
Antworten:
Verwenden Sie
 
stattdessen den Entitätscode .
ist eine HTML "Zeichenentitätsreferenz". Es gibt keine benannte Entität für nicht unterbrechenden Speicherplatz in XML, daher verwenden Sie den Code 
.Wikipedia enthält eine Liste von XML und HTML - Entitäten , und Sie können sehen , dass es nur 5 „vordefinierte Entitäten“ in XML, HTML , aber über 200 hat werde ich darauf über auch einen Raum zu schaffen (& nbsp;) in XSL , das hat ausgezeichnete Antworten.
quelle
Š
anstelle 
der letzteren, die immer in einen Unicode-Leerzeichen ohne Unterbrechung aufgelöst wird. 
funktioniert wirklich gut. Es wird jedoch eines dieser seltsamen Zeichen in der ANSI-Codierung angezeigt.<xsl:text>
hat am besten für mich funktioniert.quelle
Man kann das auch machen:
quelle
disable-output-escaping
, was nicht erforderlich ist und in XSLT 2.0 und mehr noch in 3.0 veraltet war. In diesen Versionen können Sie den gleichen Effekt erzielen, wenn Siexsl:character-map
garantiert prozessorübergreifend arbeiten. Außerdem wird dadurch eine benannte Entität
in die Ausgabe eingefügt, die nicht unbedingt mit einem nicht unterbrechenden Leerzeichen identisch ist, und auf der Empfangsseite muss diese Entität deklariert sein (in HTML ist dies normalerweise implizit).Benutze das
edit: Downvoters sollten wahrscheinlich überprüfen, ob dies zuerst funktioniert (es funktioniert und ist die allgemeinste Lösung für das Problem.)
quelle
Möglicherweise möchten Sie die Definition für diese Entität am Anfang der Datei hinzufügen (unter der XML-Deklaration):
Sie können auch weitere Entitäten wie Ntilde, Aacute usw. hinzufügen.
quelle
Zusätzlich zur Antwort von Victor Hugo ist es möglich, alle bekannten Zeichenreferenzen in einer XSLT-Datei wie folgt legal zu machen:
Es gibt auch einen gewissen Unterschied im Ergebnis dieses Ansatzes im Vergleich zu
<xsl:text disable-output-escaping="yes">
einem. Letzteres wird String-Literale erzeugen, wie
für alle Arten von Ausgaben, auch für<xsl:output method="text">
, und dies kann sich von dem unterscheiden, was Sie vielleicht wünschen ... Im Gegenteil, wenn Entitäten für XSLT-Vorlagen über definiert werden,<!DOCTYPE ... <!ENTITY ...
wird immer eine Ausgabe erzeugt, die mit übereinstimmt Ihrexsl:output
Einstellungen.Wenn alle Zeichenreferenzen eingeschlossen sind, kann es sinnvoll sein, einen lokalen Entitätsauflöser zu verwenden, um zu verhindern, dass die XSLT-Engine Zeichenentitätsdefinitionen 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. In meinem Blog XSLT, Entities, Java, Xalan ... finden Sie Patch-Download und Kommentare.
quelle
Wenn Sie Folgendes verwenden (ohne
disable-output-escaping
!), Erhalten Sie ein einzelnes Leerzeichen ohne Unterbrechung:<xsl:text> </xsl:text>
quelle
disable-output-escaping
für dieseXSLT- Stylesheets müssen aus wohlgeformtem XML bestehen. Da
" "
es sich nicht um eine der fünf vordefinierten XML-Entitäten handelt , kann es nicht direkt in das Stylesheet aufgenommen werden. Die Rückkehr zu Ihrer Lösung" "
ist also ein perfekter Ersatz, den" "
Sie verwenden sollten.Beispiel:
quelle
Sie können auch verwenden:
Denken Sie an den Verstärker nach dem & oder Sie erhalten eine Fehlermeldung
quelle
&nbsp;
(vorausgesetzt, Sie wollten ein Semikolon verwenden), das als
und nicht als `` (nb-Leerzeichen) gerendert wird.Ich habe versucht, Rahmen für eine leere Zelle in einer HTML-Tabelle anzuzeigen. Mein alter Trick, nicht unterbrechenden Speicherplatz in leeren Zellen zu verwenden, funktionierte nicht mit xslt. Ich habe Zeilenumbruch mit dem gleichen Effekt verwendet. Ich erwähne dies nur für den Fall, dass der Grund, warum Sie versucht haben, den nicht unterbrechenden Bereich zu verwenden, darin bestand, einer "leeren" Tabellenzelle Inhalt zu geben, um die Zellränder zu aktivieren.
quelle
Versuchen zu benutzen
Dies hängt jedoch vom verwendeten XSLT-Prozessor ab: Für die XSLT-Spezifikation müssen keine XSLT-Prozessoren in "
" konvertiert werden .quelle
Obwohl die Antwort bereits von @brabster und anderen gegeben wurde.
Ich denke, eine wiederverwendbarere Lösung wäre:
quelle