Erro: O destino da instrução de processamento correspondente a [[xX] [mM] [lL] ”não é permitido

181

Esse erro,

O destino da instrução de processamento correspondente a "[xX] [mM] [lL]" não é permitido

ocorre sempre que executo uma página XSLT que começa da seguinte maneira:

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

Nota : removi os espaços à esquerda antes da primeira linha, mas o erro ainda ocorre!

Java Player
fonte
1
Este erro não é específico para o XSLT; refere-se à análise de XML em geral. Verifique não apenas o seu arquivo XSLT principal, mas também os arquivos XSLT incluídos / importados ( ../header.xsl), bem como o documento de entrada XML que está sendo transformado, para cada uma das três possibilidades listadas na minha resposta abaixo .
kjhughes

Respostas:

365

Ferramentas baseadas em Xerces emitem o seguinte erro

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

quando uma declaração XML é encontrada em qualquer lugar que não seja na parte superior de um arquivo XML.

Esta é uma mensagem de diagnóstico válida; outros analisadores XML devem emitir uma mensagem de erro semelhante nessa situação.

Para corrigir o problema, verifique as seguintes possibilidades:

  1. Algum espaço em branco ou outro conteúdo visível existe antes da <?xml ?> declaração.

    Resolução : remova o espaço em branco ou qualquer outro conteúdo visível antes da declaração XML.

  2. Algum conteúdo invisível existe antes da <?xml ?> declaração. Geralmente, essa é uma marca de ordem de bytes (BOM) .

    Resolução : remova a BOM usando técnicas como as sugeridas pela página W3C na BOM em HTML.

  3. Existe uma declaração dispersa <?xml ?>no conteúdo XML. Isso pode acontecer quando os arquivos XML são combinados programaticamente ou via recortar e colar. Só pode haver uma <?xml ?>declaração em um arquivo XML e ela pode estar apenas na parte superior.

    Resolução : <?xmlprocure de maneira que não diferencie maiúsculas de minúsculas e remova tudo, exceto a declaração XML principal do arquivo.

kjhughes
fonte
Para um <? Xml perdido, como você realmente iteria através do arquivo xml para encontrá-lo? Como seria usar algo como sax ou analisadores Stax bom trabalho (tentei fazê-lo com Stax mas não reconhecê-lo)
user2062207
Para eliminar uma declaração XML perdida, você deve tratar o arquivo como texto, não XML, porque uma declaração XML extra impede que o XML seja bem formado . Use um editor de texto ou abra o arquivo programaticamente e opere como texto para eliminar a <?xml ?>declaração dispersa antes de tratá-lo como um arquivo XML.
kjhughes
4
Você tem minhas simpatias, pois problemas intermitentes são notoriamente difíceis de depurar. No entanto, não posso ajudar mais aqui além de dizer que esse erro é definitivamente determinístico : sempre será um erro uma declaração XML aparecer mais de uma vez ou em qualquer outro lugar que não seja a parte superior de um arquivo XML. Boa sorte.
kjhughes
1
Se sua mensagem XML estiver armazenada como uma String, você pode tentar fazer um trim () na String antes de passá-la ao seu SAX Parser. Por alguma razão, eu estava recebendo respostas XML que introduziam espaço em branco extra no início, o que resultou no erro Xerces acima quando analisado.
Robert Casey
1
É um encadeamento antigo, mas isso pode ajudar alguém: Depois de copiar manualmente um arquivo xml do navegador e copiar colar no arquivo de texto local e salvar como um xml, obtivemos o mesmo erro (o arquivo em questão era um pom.xml e o erro foi recebido ao fazer uma compilação no gradle). Descobrimos que havia uma linha vazia na parte superior do arquivo xml, mesmo antes da tag <? Xml>, removê-la e funcionou!
JavaTec 19/01/19
13

A razão para mim é 2 dos seguintes códigos em um xml

<?xml version="1.0" encoding="utf-8"?>
Anuj Jindal
fonte
2
Eu removo espaços na frente das versões <? Xml ... e isso funcionou para mim.
xpagesbeast
1
Essa resposta foi já previsto : # 3: resolução : Procurar <?xmlde forma case-insensitive, e remover todos, mas a declaração top XML a partir do arquivo.
precisa saber é o seguinte
Pode confirmar, alguém estragou a cópia e colar.
fl0w
3

Havia uma mensagem de Copyright gerada automaticamente XMLe uma linha em branco antes da <resources>tag. Depois que a removi, minha compilação foi bem-sucedida.

insira a descrição da imagem aqui

Hitesh Sahu
fonte
1
A remoção de comentários ou espaço em branco antes da declaração XML pode eliminar esse erro, mas para o documento mostrado em sua imagem, não há necessidade de remover o comentário ou a linha em branco após a declaração XML.
Kjhughes
1

Outro motivo do erro acima é o arquivo jar corrompido. Eu recebi o mesmo erro, mas para o Junit ao executar testes de unidade. A remoção do jar e o download novamente corrigem o problema.

Peter T.
fonte
0

no meu caso, havia um caminho errado em um arquivo de configuração: o arquivo não foi encontrado (o caminho estava errado) e saiu com esta exceção:

Erro ao configurar a partir do fluxo de entrada. A causa inicial foi O destino da instrução de processamento correspondente "[xX] [mM] [lL]" não é permitido.

pikimota
fonte
0

Eu tive um problema semelhante com 50.000 arquivos rdf / xml em 5.000 diretórios (o arquivo de catálogo do Project Gutenberg). Eu resolvi com motim (na distribuição jena)

o diretório é cache / epub / NN / nn.rdf (onde NN é um número)

no diretório acima do diretório onde estão todos os arquivos, ou seja, no cache

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

Isso produz possivelmente muitos avisos, mas o resultado está em um formato que pode ser carregado no jena (usando a interface da web fuseki).

surpreendentemente simples (pelo menos neste caso).

user855443
fonte
0

Para PHP, coloque esta linha de código antes de começar a imprimir seu XML:

while(ob_get_level()) ob_end_clean();
Beachhouse
fonte