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.
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).
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 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).
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 tą 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):
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 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.
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 ...
Arkusze stylów XSLT muszą być poprawnie sformatowanymi plikami XML. Ponieważ " "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 " "jest idealnym zamiennikiem, " "którego powinieneś użyć.
Spowoduje to wyświetlenie wyniku &nbsp;(zakładając, że masz tam być średnik), który będzie renderowany jako , 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.
Odpowiedzi:
 
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.
źródło
Š
Zamiast 
tego drugiego, które zawsze będzie rozwiązywać do spacji niezniszczającej Unicode. 
działa naprawdę dobrze. Wyświetli jednak jeden z tych dziwnych znaków w kodowaniu ANSI.<xsl:text>
działało najlepiej dla mnie.źródło
Można to również zrobić:
źródło
disable-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 zxsl:character-map
gwarancją pracy między procesorami. Ponadto umieszcza nazwany byt
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).Użyj tego
edit: Downvoters powinni prawdopodobnie sprawdzić, czy to działa najpierw (działa i jest najbardziej ogólnym rozwiązaniem problemu).
źródło
Możesz dodać definicję tego obiektu na początku pliku (poniżej deklaracji xml):
Możesz także dodać więcej podmiotów, takich jak Ntilde, Aacute itp.
źródło
Oprócz odpowiedzi Victora Hugo możliwe jest uzyskanie legalności wszystkich znanych odniesień do znaków w pliku XSLT, takich jak:
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
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 twojexsl:output
ustawienia.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.
źródło
Gdy użyjesz (bez
disable-output-escaping
!) Następujących elementów , otrzymasz jedno nierozdzielające miejsce:<xsl:text> </xsl:text>
źródło
disable-output-escaping
tegoArkusze stylów XSLT muszą być poprawnie sformatowanymi plikami XML. Ponieważ
" "
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" "
jest idealnym zamiennikiem," "
którego powinieneś użyć.Przykład:
źródło
możesz także użyć:
zapamiętaj wzmacniacz po & lub otrzymasz komunikat o błędzie
źródło
&nbsp;
(zakładając, że masz tam być średnik), który będzie renderowany jako
, a nie jako `` (nb-space).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.
źródło
Spróbuj użyć
Ale zależy to od używanego procesora XSLT: specyfikacja XSLT nie wymaga procesorów XSLT do konwersji na „
”.źródło
Chociaż odpowiedź została już udzielona przez @brabster i innych.
Myślę, że rozwiązaniem wielokrotnego użytku byłoby:
źródło