So fügen Sie & nbsp; in XSLT


207

Wie kann ich einfügen

 

In einem XSLT-Stylesheet wird immer wieder der folgende Fehler angezeigt:

XML-Analysefehler: undefinierte Entität

Im Wesentlichen möchte ich ein nicht unterbrechendes Leerzeichen in der XSLT-Vorlage.


2
Sie können auch & # xA0; gleich zu & # 160; Schauen Sie hier stackoverflow.com/questions/7511214/…
user3766111

Antworten:


336

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.


3
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.
Abel

Der Link Top Ten Java- und XSLT-Tipps ist wirklich nützlich.
LCJ

<xsl: text> & # 160; </ xsl: text> es trennt die beiden Felder
Manash Ranjan Dakua

1
Die Verbindung ist verfault.
GSerg

37

&#160;funktioniert wirklich gut. Es wird jedoch eines dieser seltsamen Zeichen in der ANSI-Codierung angezeigt. <xsl:text>hat am besten für mich funktioniert.

<xsl:text> </xsl:text>

3
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).
Abel

25

Man kann das auch machen:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

2
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 &nbsp;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).
Abel

21

Benutze das

<xsl:text disable-output-escaping="yes">&amp;</xsl:text>nbsp;

edit: Downvoters sollten wahrscheinlich überprüfen, ob dies zuerst funktioniert (es funktioniert und ist die allgemeinste Lösung für das Problem.)


1
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):

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>

Sie können auch weitere Entitäten wie Ntilde, Aacute usw. hinzufügen.


5

Zusätzlich zur Antwort von Victor Hugo ist es möglich, alle bekannten Zeichenreferenzen in einer XSLT-Datei wie folgt legal zu machen:

<!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>&amp; &nbsp; &ndash;</xsl:text>

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 &nbsp;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.


1
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 ...
Sergey Ushakov


2

Wenn Sie Folgendes verwenden (ohne disable-output-escaping!), Erhalten Sie ein einzelnes Leerzeichen ohne Unterbrechung:

<xsl:text>&#160;</xsl:text>


4
Sie brauchen nicht disable-output-escapingfür diese
Ian Roberts

2

XSLT- Stylesheets müssen aus wohlgeformtem XML bestehen. Da "&nbsp;"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 "&#160;"ist also ein perfekter Ersatz, den "&nbsp;"Sie verwenden sollten.

Beispiel:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>

0

Sie können auch verwenden:

<xsl:value-of select="'&amp;nbsp'"/>

Denken Sie an den Verstärker nach dem & oder Sie erhalten eine Fehlermeldung


Dies wird ausgegeben &amp;nbsp;(vorausgesetzt, Sie wollten ein Semikolon verwenden), das als &nbsp;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.

<br/>

Ich habe ein ähnliches Szenario, und dies scheint zu funktionieren, um die Tabellenzellen zum Rendern zu bringen.
Richard Moore

0

Versuchen zu benutzen

<xsl:text>&#160;</xsl:text>

Dies hängt jedoch vom verwendeten XSLT-Prozessor ab: Für die XSLT-Spezifikation müssen keine XSLT-Prozessoren in " &nbsp;" konvertiert werden .


0

Obwohl die Antwort bereits von @brabster und anderen gegeben wurde.
Ich denke, eine wiederverwendbarere Lösung wäre:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.