Błąd: cel instrukcji przetwarzania pasujący „[xX] [mM] [lL]” jest niedozwolony

181

Ten błąd,

Dopasowanie celu instrukcji przetwarzania „[xX] [mM] [lL]” jest niedozwolone

występuje za każdym razem, gdy uruchamiam stronę XSLT, która zaczyna się w następujący sposób:

<?xml version="1.0" encoding="windows-1256"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:include href="../header.xsl"/>
  <xsl:template match="/">
    <xsl:call-template name="pstyle"/>
    <xsl:call-template name="Validation"/>
    <xsl:variable name="strLang">
      <xsl:value-of select="//lang"/>
    </xsl:variable>
    <!-- ////////////// Page Title ///////////// -->
    <title>
        <xsl:value-of select="//ListStudentFinishedExam.Title"/>
    </title>

Uwaga : usunąłem spacje wiodące przed pierwszym wierszem, ale błąd nadal występuje!

Java Player
źródło
1
Ten błąd nie dotyczy wyłącznie XSLT; dotyczy ogólnie parsowania XML. Sprawdź nie tylko główny plik XSLT, ale także wszelkie dołączone / importowane pliki XSLT ( ../header.xsl), a także transformowany dokument wejściowy XML, dla każdej z trzech możliwości wymienionych poniżej w mojej odpowiedzi .
kjhughes,

Odpowiedzi:

365

Narzędzia oparte na Xerces będą generować następujący błąd

The processing instruction target matching "[xX][mM][lL]" is not allowed.

gdy napotkamy deklarację XML w innym miejscu niż na górze pliku XML.

To jest prawidłowy komunikat diagnostyczny; inne parsery XML powinny w tej sytuacji wygenerować podobny komunikat o błędzie.

Aby rozwiązać problem, sprawdź następujące możliwości:

  1. Przed deklaracją istnieje pusta przestrzeń lub inna widoczna treść <?xml ?>.

    Rozwiązanie : usuń puste miejsce lub inną widoczną zawartość przed deklaracją XML.

  2. Niektóre niewidoczne treści istnieją przed <?xml ?> deklaracją. Najczęściej jest to znak kolejności bajtów (BOM) .

    Rozwiązanie : Usuń BOM przy użyciu technik takich jak te sugerowane przez stronę W3C na BOM w HTML.

  3. W treści XML istnieje deklaracja zbłąkana <?xml ?>. Może się to zdarzyć, gdy pliki XML są łączone programowo lub metodą wycinania i wklejania. <?xml ?>Plik XML może zawierać tylko jedną deklarację i może znajdować się tylko na górze.

    Rozwiązanie : wyszukaj <?xmlbez rozróżniania wielkości liter i usuń z pliku wszystkie deklaracje XML oprócz górnej.

kjhughes
źródło
W przypadku zbłąkanego <? Xml, jak byś faktycznie zajął się iteracją pliku xml, aby go znaleźć? Jakby użycie czegoś takiego jak parsery sax lub stax działało dobrze (próbowałem zrobić to ze stax, ale go nie rozpoznaje)
user2062207 11.11.14
Aby wyeliminować zabłąkanego deklarację XML, trzeba traktować ten plik jako tekst, nie XML, ponieważ dodatkowa deklaracja XML XML zapobiega przed dobrze uformowane . Użyj edytora tekstu lub otwórz programowo plik i działaj na nim jako tekst, aby wyeliminować zbłąkane <?xml ?>deklaracje przed potraktowaniem go jako pliku XML.
kjhughes,
4
Wyrazicie moje współczucie, ponieważ sporadyczne problemy są niezwykle trudne do debugowania. Nie mogę jednak pomóc w tej kwestii poza stwierdzeniem, że ten błąd jest zdecydowanie deterministyczny : zawsze wystąpi błąd, gdy deklaracja XML pojawi się więcej niż raz lub w dowolnym miejscu innym niż górna część pliku XML. Powodzenia.
kjhughes,
1
Jeśli komunikat XML jest przechowywany jako ciąg, możesz spróbować wykonać trim () na łańcuchu przed przekazaniem go do analizatora składni SAX. Z jakiegoś powodu otrzymywałem odpowiedzi XML, które wprowadziły dodatkowe białe znaki na początku, co spowodowało powyższy błąd Xerces podczas analizy.
Robert Casey
1
To stary wątek, ale to może komuś pomóc: po ręcznym skopiowaniu pliku xml z przeglądarki i skopiowaniu wklejenia do lokalnego pliku tekstowego i zapisaniu go jako xml, otrzymaliśmy ten sam błąd (plik, o którym mowa, to pom.xml i błąd otrzymano podczas kompilacji na grad). Dowiedzieliśmy się, że na początku pliku xml była pusta linia, nawet przed znacznikiem <? Xml>, usunęliśmy go i zadziałał!
JavaTec
13

Powodem dla mnie są 2 następujące kody w jednym xml

<?xml version="1.0" encoding="utf-8"?>
Anuj Jindal
źródło
2
Usuwam spacje przed wersjami <? Xml ... i to działało dla mnie.
xpagesbeast
1
Ta odpowiedź została już udzielona : # 3: Rozwiązanie : Wyszukaj <?xmlbez rozróżniania wielkości liter i usuń z pliku wszystkie deklaracje XML oprócz górnej.
kjhughes
Może potwierdzić, że ktoś pomieszał kopię i wklej.
fl0w
3

Była tam automatycznie generowana wiadomość o prawach autorskich XMLi pusta linia przed <resources>tagiem, po jej usunięciu moja kompilacja zakończyła się powodzeniem.

wprowadź opis zdjęcia tutaj

Hitesh Sahu
źródło
1
Usunięcie komentarzy lub białych znaków przed deklaracją XML może wyeliminować ten błąd, ale w przypadku dokumentu pokazanego na obrazie nie ma potrzeby usuwania komentarza ani pustej linii po deklaracji XML.
kjhughes
1

Innym powodem powyższego błędu jest uszkodzony plik jar. Otrzymałem ten sam błąd, ale w przypadku Junita podczas uruchamiania testów jednostkowych. Usunięcie słoika i ponowne pobranie go naprawić problem.

Peter T.
źródło
0

w moim przypadku niewłaściwa ścieżka w pliku konfiguracyjnym: plik nie został znaleziony (ścieżka była niepoprawna) i wyszedł z tym wyjątkiem:

Błąd konfiguracji ze strumienia wejściowego. Początkowa przyczyna była niedopuszczalna. Cel przetwarzania instrukcji „[xX] [mM] [lL]” jest niedozwolony.

pikimota
źródło
0

Miałem podobny problem z 50 000 plików rdf / xml w 5000 katalogów (plik katalogu Project Gutenberg). Rozwiązałem to za pomocą zamieszek (w dystrybucji jeny)

katalog to cache / epub / NN / nn.rdf (gdzie NN jest liczbą)

w katalogu nad katalogiem, w którym znajdują się wszystkie pliki, tj. w pamięci podręcznej

riot epub/*/*.rdf --output=turtle > allTurtle.ttl

Powoduje to prawdopodobnie wiele ostrzeżeń, ale wynik jest w formacie, który można załadować do Jeny (przy użyciu interfejsu internetowego fuseki).

zaskakująco proste (przynajmniej w tym przypadku).

użytkownik855443
źródło
0

W przypadku PHP umieść ten wiersz kodu przed rozpoczęciem drukowania XML:

while(ob_get_level()) ob_end_clean();
Dom na plaży
źródło