2009-09-22 8 views
176

Jak mogę wstawićJak wstawić   w XSLT

 

Do arkusza stylów XSLT, wciąż otrzymuję ten błąd:

XML Parsing Error: undefined entity

Zasadniczo chcę non znak spacji łamanie w szablonie XSLT .

+2

Można również użyć   samo   wygląd tutaj http://stackoverflow.com/questions/7511214/what-is-the-difference-between-x00a0-and- 160 – user3766111

Odpowiedz

293

Spróbuj użyć podmiotu   zamiast tego.

Więcej szczegółów na temat dlaczego   nie działa i innych opcji here.

+6

Świetnie, dokładnie to, czego potrzebowałem ... –

+2

+1 i zawsze istnieje możliwość, by również rozpoznać postać nbsp. –

+3

Natrafiliśmy na sytuację, w której w jednym z wielu XSL przestał działać z tą techniką i zaczął pokazywać dziwną postać. Jednak jeśli użyję techniki CDATA WaterSoul, to działa. –

21

Użyj tego

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

edit: Downvoters prawdopodobnie powinien potwierdzić, że działa to pierwszy (. To robi, i jest najbardziej ogólne rozwiązanie problemu)

+1

nbsp nie jest wyraźnie zakodowaną przestrzenią. –

+2

Nigdy nie powiedziałem, że to – jagprinderdeep

+0

Martwię się o mój stan psychiczny. Jestem pewien, że skomentowałem odpowiedź, mówiąc coś w stylu "dlaczego nie używać CDATA zamiast jawnie kodować przestrzeń". Nie widzę ani śladu, ale wciąż mam odrobinę pewności siebie. Powiedz mi, czy oszalałeś? –

11

Możesz chcieć dodać definicję podmiot ten na początku pliku (poniżej deklaracji xML):

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

również można dodać kolejne podmioty takie jak Ntilde, aacute itp

25

Można też to zrobić:

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

To zadziała * jeśli procesor obsługuje 'disable-output-escaping' *, które nie jest wymagane i jest przestarzałe w XSLT 2.0 i nowszych wersjach, w wersji 3.0. W tych wersjach można osiągnąć ten sam efekt dzięki 'xsl: character-map' gwarantowanym do pracy z wieloma procesorami. Ponadto umieszcza nazwaną jednostkę ' ' w wynikach, która * nie musi być taka sama jak nierozdzielająca przestrzeń *, a końcowy odbiorca * musi mieć deklarację tej jednostki * (w HTML zwykle jest to niejawnie). – Abel

-1

starałem się wyświetlać granice na pustej komórki w tabeli HTML. Moja stara sztuczka polegająca na używaniu nieprzerwania przestrzeni w pustych komórkach nie działała z xslt. Zastosowałem podział linii z tym samym efektem. Wspominam o tym na wypadek, gdyby powodem, dla którego próbowaliście skorzystać z nierozdzielającej się przestrzeni, było przekazanie treści do "pustej" komórki tabeli w celu włączenia granic komórek.

<br/> 
5

oprócz victor hugo's answer to jest możliwe, aby uzyskać wszystkie znane referencje charakter prawny w pliku XSLT, tak:

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

Jest też pewna różnica w wyniku tego podejścia w porównaniu do <xsl:text disable-output-escaping="yes"> jeden. Ten ostatni będzie produkował ciągi literowe, takie jak &nbsp; dla wszystkich rodzajów danych wyjściowych, nawet dla <xsl:output method="text">, a może się to różnić od tego, czego możesz chcieć ... Wręcz przeciwnie, pobieranie obiektów zdefiniowanych dla szablonu XSLT przez <!DOCTYPE ... <!ENTITY ... zawsze spowoduje wyjście zgodne z ustawieniami xsl:output.

I przy uwzględnianiu wszystkich odniesień do znaków rozsądne może być użycie lokalnego narzędzia do rozpoznawania nazw, aby silnik XSLT nie pobierał z Internetu definicji jednostek. Użytkownicy JAXP lub jawni użytkownicy Xalan-J mogą potrzebować łatki dla Xalan-J, aby poprawnie używać resolwera. Zobacz mój blog XSLT, entities, Java, Xalan..., aby pobrać poprawki i komentarze.

+1

Pamiętaj, że od niedawna W3 zaczęło blokować zbyt wiele żądań dla tych i podobnych linków, jeśli pochodzi z zautomatyzowanego procesu. Umieść ten plik lokalnie lub na swoim serwerze i odpowiednio dostosuj adres URL, a wszystko powinno być w porządku. Poza tym +1 i doskonałe rozwiązanie do używania nazwanych elementów HTML. – Abel

+0

Dobra wiadomość, a jest jeszcze jeden powód, aby mieć lokalną kopię pliku z definicjami encji, w przeciwnym razie proces XSLT może się nie udać, jeśli połączenie internetowe nie jest dostępne. W świecie Java nie ma potrzeby zhakowania adresów URL, ponieważ możliwe jest zorganizowanie [EntityResolver] (http://docs.oracle.com/javase/8/docs/api/org/xml/sax/EntityResolver. html) i [Apache XML Commons Resolver] (http://xerces.apache.org/xml-commons/components/resolver/) może być dobrym kandydatem. Inne platformy programistyczne również mogą mieć podobne techniki ... –

+0

Tak, więc dla odniesienia, dla dotnetters: [metoda abstrakcyjna ResolveEntity] (https://msdn.microsoft.com/en-us/library/system.xml. xmlreader.resolveentity% 28v = vs.110% 29.aspx) dla encji i [XmlResolver do ładowania zewnętrznych zasobów] (https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.xmlresolver%28v = vs.110% 29.aspx), które są odpowiednikami [.NET dla tych metod Java] (http://stackoverflow.com/questions/942882/does-the-java-uriresolver-concept-exist-in-c- -sharp-and-net). – Abel

2

Podczas korzystania z następujących dostaniesz jeden non-breaking space (bez disable-output-escaping!):

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

+4

Nie potrzebujesz 'disable-output-escaping' dla tego –

25

&#160; działa bardzo dobrze. Jednakże wyświetli jeden z tych dziwnych znaków w kodowaniu ANSI. <xsl:text> pracował dla mnie najlepiej.

<xsl:text> </xsl:text> 
+3

Używając zaakceptowanej odpowiedzi, skończyłem z linią podziału w moim wyjściu XML (przynajmniej tak to wyglądało w edytorze XML VS2010). Używając tej odpowiedzi otrzymuję dokładnie 1 miejsce. –

+1

@Matthijs, jest to spacja, a nie niepodzielona przestrzeń, która nie jest taka sama. Jeśli VS pokazuje to niepoprawnie, sprawdź kodowanie (VS potrafi to poprawnie pokazać i kodowanie powinno być niezależne, więc prawdopodobnie robisz coś złego). – Abel

0

można również użyć:

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

pamiętać amp po & lub otrzymasz komunikat o błędzie

+0

Spowoduje to wypisanie '& nbsp;' (zakładając, że masz zamiar wstawić średnik), które będzie renderowane jako ' ', a nie jako '' (nb-space). – Abel

1

XSLT stylów musi być dobrze uformowane XML. Ponieważ "&nbsp;" nie jest jednym z the five predefined XML entities, nie można go bezpośrednio dołączyć do arkusza stylów. Powracając do swojego 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"/>