Mam dynamicznie wygenerowany dokument XML wykonany z PHP DOMDocument. Używam tego XML z plikiem XSL. Działało dobrze, dopóki nie otrzymałem symbolu waluty jena (¥) z wpisu do bazy danych. Ten symbol jest escapowany do encji ¥ HTML. Ta jednostka łamie silnik XSL/XML:

Ostrzeżenie: DOMDocument::load() [domdocument.load]: Jednostka 'yen' nie zdefiniowana w %file.xml%, wiersz: %1% w %file.php% w wierszu %2%

Gdy nie ma encji ¥, wszystko działa dobrze.

Czy jest coś, czego nie zrobiłem/nie włączyłem/skonfigurowałem, aby uzyskać ten błąd?

1
AlexV 22 lipiec 2011, 17:58
Odpowiedź na tytuł twojego pytania brzmi tak, ale zgodnie z twoimi komentarzami, to nie jest to, czego próbujesz się dowiedzieć. Jeśli opublikujesz część swojego kodu PHP, który generuje jednostkę jen, być może będziemy w stanie Ci bardziej pomóc. Na przykład jakich metod używasz do serializacji?
 – 
LarsH
22 lipiec 2011, 19:25

3 odpowiedzi

Najlepsza odpowiedź

XML rozpoznaje tylko kilka jednostek znakowych: &lt;, &gt; &quot;, &amp;, &apos;. Wszystko inne byłoby błędem parsowania, chyba że samodzielnie dodasz definicje encji: <!ENTITY yen "&#x00a5">

3
Marc B 22 lipiec 2011, 18:13

Dzięki &yen; Twój XML staje się niepoprawnie sformatowany, ponieważ XML nie ma predefiniowanej encji &yen;. Prawidłowa wersja ucieczki ¥ to &#xA5;.

2
Kirill Polishchuk 22 lipiec 2011, 18:04
Tak, wiem o tym, ale dlaczego DOMDocument automatycznie je pomija?
 – 
AlexV
22 lipiec 2011, 18:07

Jeśli chodzi o pracę z XML, jedynymi encjami zdefiniowanymi domyślnie są &amp;, &lt; i &gt;. Wszelkie inne podmioty należy zdefiniować w DTD.

XSL nie definiuje żadnych innych jednostek w swoim doctype. Nawet jeśli konwertujesz na (x)HTML, nie masz zdefiniowanych innych jednostek, ponieważ Twój podstawowy typ dokumentu jest przeznaczony dla XSL.

można dodać wiele deklaracji, aby zdefiniować je w DTD, ale oznaczałoby to użycie niestandardowego DTD, co nie jest idealne, a jego utrzymanie wymaga dużo pracy.

Szczerze mówiąc, najłatwiejszym rozwiązaniem tego problemu jest po prostu użycie kodu jednostki numerycznej do wszystkiego. To uciążliwe, ale działa w każdym dialekcie XML bez konieczności hackowania za pomocą DTD.

1
Spudley 22 lipiec 2011, 18:25
Mój problem polega na tym, że wygląda na to, że metoda DOMDocument::createTextNode automatycznie przeskakuje ¥ do ¥, przerywając później proces...
 – 
AlexV
22 lipiec 2011, 18:47
@Alex: możesz edytować swoje pytanie, aby wyjaśnić, że pytasz, dlaczego DOMDocument wyświetla tę encję... większość ludzi myśli, że pytasz, dlaczego ta encja nie jest dozwolona w XML.
 – 
LarsH
22 lipiec 2011, 19:19