Jak wstawić & nbsp; w XSLT

207

Jak mogę wstawić

 

W arkuszu stylów XSLT ciągle pojawia się ten błąd:

Błąd analizy XML: niezdefiniowana jednostka

Zasadniczo chcę, aby w szablonie XSLT nie występowała spacja.

J L.
źródło
2
Możesz także użyć & # xA0; to samo co & # 160; spójrz tutaj stackoverflow.com/questions/7511214/…
user3766111

Odpowiedzi:

337

 Zamiast tego użyj kodu encji .

 to HTML „odwołanie do znaku”. Nie ma nazwanego elementu dla nierozdzielającego miejsca w XML, więc używasz kodu  .

Wikipedia zawiera listę encji XML i HTML , i widać, że w XML jest tylko 5 „predefiniowanych encji”, ale HTML ma ponad 200. Wskażę też na Tworzenie spacji (& nbsp;) w XSL, która ma doskonałe odpowiedzi.

Brabster
źródło
3
Niedawno natrafiliśmy na sytuację, w której w jednym z wielu XSL przestał pracować z tą techniką i zaczął pokazywać dziwną postać. Jeśli jednak użyję techniki CDATA WaterSoul, to zadziała.
@BrianReindel, to prawdopodobnie oznacza, że ​​użyłeś niewłaściwego odwołania do encji numerycznej, tj. ŠZamiast  tego drugiego, które zawsze będzie rozwiązywać do spacji niezniszczającej Unicode.
Abel
Link Top Ten Java and XSLT Tips jest bardzo przydatny.
LCJ
<xsl: text> & # 160; </ xsl: text> oddzielają dwa pola
Manash Ranjan Dakua
1
Link zgnił.
GSerg,
37

&#160;działa naprawdę dobrze. Wyświetli jednak jeden z tych dziwnych znaków w kodowaniu ANSI. <xsl:text>działało najlepiej dla mnie.

<xsl:text> </xsl:text>
Saroj
źródło
3
Korzystając z zaakceptowanej odpowiedzi, skończyło się na rozdzieleniu wiersza w moim pliku wyjściowym XML (przynajmniej tak to wyglądało w edytorze XML VS2010). Korzystając z tej odpowiedzi, otrzymuję dokładnie 1 miejsce.
Mathijs Flietstra
1
@Matthijs, to jest spacja, a nie przestrzeń niezniszczalna, to nie to samo. Jeśli VS pokazuje to niepoprawnie, sprawdź swoje kodowanie (VS doskonale pokazuje to poprawnie i powinno być niezależne od kodowania, więc bardziej prawdopodobne jest, że zrobiłeś coś innego źle).
Abel
25

Można to również zrobić:

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>
WaterSoul
źródło
2
Działa to, jeśli procesor obsługujedisable-output-escaping , co nie jest wymagane i zostało przestarzałe w XSLT 2.0 i więcej w 3.0. W tych wersjach możesz osiągnąć ten sam efekt z xsl:character-mapgwarancją pracy między procesorami. Ponadto umieszcza nazwany byt &nbsp;na wyjściu, który niekoniecznie jest taki sam jak spacja niełamiąca, a odbiorca musi mieć zadeklarowany byt (w HTML jest to zwykle niejawnie).
Abel
21

Użyj tego

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

edit: Downvoters powinni prawdopodobnie sprawdzić, czy to działa najpierw (działa i jest najbardziej ogólnym rozwiązaniem problemu).

jagprinderdeep
źródło
1
Nie jestem pewien, ale przetestowałem swoje podejście i działa, więc nie jestem pewien, do czego służyło głosowanie :(
jagprinderdeep
2
Ponadto zaakceptowana odpowiedź nie będzie ważna dla wszystkich parserów zgodnie z połączoną stroną; tylko jeden na
jednego
1
Podałem już powód mojego głosowania, ale jeśli miałbym głosować za odpowiedzią, to byłby to powód - odpowiada na złe pytanie. OP wyraźnie zapytał, jak umieścić w niezniszczalnej przestrzeni, używając xslt, a ty odpowiedziałeś, jak umieścić sekwencję ampersand-nbsp-średnik. A kłótnie o głosy przegłosowane również są niespokojne. Ale tak na poważnie, czy nigdy nie wspominałeś o CDATA?
Michael Krelin - haker
1
Okej, jagprinderdeep, odwołuję mój głos, ale w zamian proszę, odwiedź mnie, jak tylko trafię do zakładu psychiatrycznego. (zwróć uwagę, że nie oddaję ci głosu z tego nowego powodu). Ale zrozum, że odpowiadasz na złe pytanie. Myślę, że to był dokładnie powód tego drugiego zdania.
Michael Krelin - haker
8
Odrzuciłem również głos, ponieważ nie możesz zagwarantować, że odbiorca końcowy zadeklaruje & nbsp ;. Jeśli pracujesz z xslt + html, to tak, jest to sposób na zrobienie tego, choć hack. Ale jeśli używasz xslt do generowania innego xml, to po prostu wysadzi cię w powietrze.
Doug
14

Możesz dodać definicję tego obiektu na początku pliku (poniżej deklaracji xml):

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

Możesz także dodać więcej podmiotów, takich jak Ntilde, Aacute itp.

Wiktor Hugo
źródło
5

Oprócz odpowiedzi Victora Hugo możliwe jest uzyskanie legalności wszystkich znanych odniesień do znaków w pliku XSLT, takich jak:

<!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>

Istnieje również pewna różnica w wyniku tego podejścia w porównaniu do <xsl:text disable-output-escaping="yes">jednego. Ta ostatnia stworzy literały łańcuchowe jak &nbsp;dla wszystkich rodzajów danych wyjściowych, nawet dla <xsl:output method="text">, i może się to różnić od tego, czego możesz sobie życzyć ... Przeciwnie, uzyskanie encji zdefiniowanych dla szablonu XSLT za pomocą <!DOCTYPE ... <!ENTITY ...zawsze będzie generować dane wyjściowe zgodne z twoje xsl:outputustawienia.

A w przypadku dołączania wszystkich odniesień do znaków rozsądne może być użycie lokalnego resolvera encji, aby silnik XSLT nie pobierał definicji encji znakowych z Internetu. Użytkownicy JAXP lub jawni użytkownicy Xalan-J mogą potrzebować łatki dla Xalan-J, aby poprawnie korzystać z resolvera. Zobacz mój blog XSLT, podmioty, Java, Xalan ... w celu pobrania łatek i komentarzy.

Siergiej Uszakow
źródło
1
Zauważ, że ostatnio W3 zaczął blokować zbyt wiele żądań do tych i podobnych łączy, jeśli pochodziły one z zautomatyzowanego procesu. Umieść ten plik lokalnie lub na serwerze i odpowiednio dostosuj adres URL, a wszystko będzie dobrze. Poza tym +1 i doskonałe rozwiązanie do używania nazwanych encji HTML.
Abel
Dobra uwaga, i jest też inny powód, aby mieć lokalną kopię pliku z definicjami encji, ponieważ w przeciwnym razie proces XSLT prawdopodobnie zawiedzie, jeśli połączenie internetowe nie będzie dostępne. W świecie Java nie trzeba hakować adresów URL, ponieważ możliwe jest zorganizowanie EntityResolver , a Apache XML Commons Resolver może być dobrym kandydatem. Inne platformy programistyczne prawdopodobnie będą miały podobne techniki ...
Sergey Ushakov
Tak, w celach informacyjnych, dla dotnetters: abstrakcyjna metoda ResolveEntity dla encji i XmlResolver do ładowania zasobów zewnętrznych , które są odpowiednikami .NET dla tych metod Java .
Abel
2

Gdy użyjesz (bez disable-output-escaping!) Następujących elementów , otrzymasz jedno nierozdzielające miejsce:

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

Shaam
źródło
4
Nie potrzebujesz disable-output-escapingtego
Ian Roberts,
2

Arkusze stylów XSLT muszą być poprawnie sformatowanymi plikami XML. Ponieważ "&nbsp;"nie jest jednym z pięciu predefiniowanych elementów XML , nie można go bezpośrednio uwzględnić w arkuszu stylów. Tak więc powrót do rozwiązania "&#160;"jest idealnym zamiennikiem, "&nbsp;"którego powinieneś użyć.

Przykład:

<xsl:value-of select="$txtFName"/>&#160;<xsl:value-of select="$txtLName"/>
Adil
źródło
0

możesz także użyć:

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

zapamiętaj wzmacniacz po & lub otrzymasz komunikat o błędzie

Mattia Vio
źródło
Spowoduje to wyświetlenie wyniku &amp;nbsp;(zakładając, że masz tam być średnik), który będzie renderowany jako &nbsp;, a nie jako `` (nb-space).
Abel
0

Próbowałem wyświetlić ramki na pustej komórce w tabeli HTML. Moja stara sztuczka polegająca na używaniu niezniszczalnego miejsca w pustych komórkach nie działała z xslt. Użyłem podziału linii z tym samym efektem. Wspominam o tym na wszelki wypadek, dla którego próbujesz użyć nieprzerwanej przestrzeni, aby podać trochę zawartości „pustej” komórce tabeli w celu włączenia granic komórki.

<br/>
BH
źródło
Mam podobny scenariusz i wydaje się, że działa to w celu uzyskania renderowania komórek tabeli.
Richard Moore,
0

Spróbuj użyć

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

Ale zależy to od używanego procesora XSLT: specyfikacja XSLT nie wymaga procesorów XSLT do konwersji na „ &nbsp;”.

Wiaczesław
źródło
0

Chociaż odpowiedź została już udzielona przez @brabster i innych.
Myślę, że rozwiązaniem wielokrotnego użytku byłoby:

<xsl:variable name="space">&#160;</xsl:variable>
...
<xsl:value-of select="$space"/>
Leonid Dashko
źródło