Ошибка: недопустимо совпадение с целевым значением инструкции обработки «[xX] [mM] [lL]»

181

Эта ошибка,

Соответствие цели инструкции обработки "[xX] [мМ] [lL]" не допускается

происходит всякий раз, когда я запускаю страницу XSLT, которая начинается следующим образом:

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

Примечание : я удалил все пробелы перед первой строкой, но ошибка все еще происходит!

Java Player
источник
1
Эта ошибка не относится к XSLT; это относится к парсингу XML в целом. Проверьте не только ваш основной XSLT-файл, но также любые включенные / импортированные XSLT-файлы ( ../header.xsl), а также преобразуемый входной XML-документ для каждой из трех возможностей, которые я перечислю в своем ответе ниже .
khhughes

Ответы:

365

Инструменты на основе Xerces выдают следующую ошибку

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

когда декларация XML встречается где-либо, кроме как в верхней части файла XML.

Это действительное диагностическое сообщение; другие парсеры XML должны выдавать подобное сообщение об ошибке в этой ситуации.

Чтобы исправить проблему, проверьте следующие возможности:

  1. Некоторое пустое пространство или другое видимое содержимое существует до <?xml ?> объявления.

    Решение : удалите пустое пространство или любой другой видимый контент до объявления XML.

  2. Некоторый невидимый контент существует до <?xml ?> объявления. Чаще всего это знак порядка байтов (BOM) .

    Решение . Удалите спецификацию, используя методы, предложенные на странице W3C в спецификации в HTML.

  3. В содержимом XML существует блуждающая <?xml ?>декларация. Это может произойти, когда файлы XML объединяются программно или посредством вырезания и вставки. В <?xml ?>XML-файле может быть только одно объявление, и оно может быть только вверху.

    Решение. Выполните поиск <?xmlбез учета регистра и удалите все, кроме верхнего XML-объявления, из файла.

kjhughes
источник
Для блуждающего <? Xml, как бы вы на самом деле пошли по итерации по файлу xml, чтобы найти его? Как, если бы что-то вроде синтаксического анализатора саксофона или саксофона работало нормально (пытался сделать это с помощью Stax, но он не распознает это)
user2062207
Чтобы исключить ложное объявление XML, вы должны обрабатывать файл как текст, а не как XML, потому что дополнительное объявление XML препятствует правильному формированию XML . Используйте текстовый редактор или откройте файл программным способом и работайте с ним как с текстом, чтобы исключить ложное <?xml ?>объявление перед обработкой его как файла XML.
khhughes
4
Вы испытываете мои соболезнования, поскольку периодически возникающие проблемы общеизвестно трудны для устранения. Тем не менее, я не могу больше помочь, кроме как сказать вам, что эта ошибка определенно является детерминированной : всегда будет ошибкой, если декларация XML будет появляться более одного раза или в любом месте, отличном от верхней части файла XML. Удачи.
kjhughes
1
Если ваше XML-сообщение хранится в виде строки, вы можете попробовать выполнить trim () для строки, прежде чем передать его в SAX Parser. По какой-то причине я получал ответы XML, которые вводили дополнительные пробелы в начале, что приводило к ошибке Xerces выше при разборе.
Роберт Кейси
1
Это старый поток, но это может кому-то помочь: после того, как мы вручную скопировали файл XML из браузера и скопировали вставку в локальный текстовый файл и сохранили его в формате XML, мы получили ту же ошибку (рассматриваемый файл был pom.xml и ошибка был получен при сборке на gradle). Мы обнаружили, что в верхней части XML-файла была пустая строка, даже до того, как тег <? Xml> удалил ее, и это сработало!
JavaTec
13

Причина для меня 2 следующих кода в одном XML

<?xml version="1.0" encoding="utf-8"?>
Анудж Джиндал
источник
2
Я удаляю пробелы перед <? Xml версиями ... и это сработало для меня.
xpagesbeast
1
Этот ответ был уже предусмотрено : # 3: Разрешение : Искать <?xmlв регистронезависимом образом, и удалить все , кроме декларации сверху XML из файла.
khhughes
Можете подтвердить, кто-то испортил копию и вставил.
fl0w
3

Там было автоматически сгенерированное сообщение об авторском праве XMLи пустая строка перед <resources>тегом, как только я удалил его, моя сборка прошла успешно.

введите описание изображения здесь

Хите саху
источник
1
Удаление комментариев или пробелов до объявления XML может устранить эту ошибку, но для документа, показанного на вашем изображении, нет необходимости удалять комментарий или пустую строку после объявления XML.
kjhughes
1

Другая причина вышеуказанной ошибки - поврежденный файл jar. Я получил ту же ошибку, но для Junit при запуске модульных тестов. Извлеките банку и загрузите ее снова, чтобы решить проблему.

Питер Т.
источник
0

в моем случае был неправильный путь в файле конфигурации: файл не был найден (путь был неправильным), и он вышел с этим исключением:

Ошибка настройки из входного потока. Первоначальная причина была: Соответствие цели инструкции обработки "[xX] [mM] [lL]" не разрешено.

pikimota
источник
0

У меня была похожая проблема с 50000 файлов rdf / xml в 5000 каталогов (файл каталога Project Gutenberg). Я решил это с бунтом (в распределении jena)

каталог является cache / epub / NN / nn.rdf (где NN - число)

в каталоге над каталогом, где находятся все файлы, т.е. в кеше

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

Это может привести к большому количеству предупреждений, но результат будет в формате, который можно загрузить в jena (используя веб-интерфейс fuseki).

удивительно просто (по крайней мере, в этом случае).

user855443
источник
0

Для PHP поместите эту строку кода перед началом печати XML:

while(ob_get_level()) ob_end_clean();
Домик на пляже
источник