Seção 3: Autores

Q 3.22: Como lidar com HTML embutida no XML?

Forneça isso na saída, use uma cópia profunda ou tente desativar escape de saída.

Além de usar as seções CDATA , há duas ocasiões comuns quando as pessoas querem lidar com o HTML incorporado dentro de um elemento XML:

  1. Quando eles receberam (possivelmente mal concebido) XML ou HTML de algum outro lugar que eles devem encontrar uma maneira de lidar;

  2. Quando eles têm um aplicativo que foi projetado explicitamente para armazenar uma série de caracteres contendo < e & Referências de entidade de caractere com o objetivo de transformá-las em marcação em um processo posterior (por exemplo, FreeMind, Atom).

Geralmente, você deseja evitar esse tipo de truque, pois geralmente indica que a estrutura e o design do documento não foram suficientemente pensados. No entanto, há ocasiões em que isso se torna inevitável, então, se você realmente precisa ou deseja usar marcação HTML incorporada dentro do XML, e faça isso processável posteriormente como marcação, existem algumas técnicas que você pode usar:

  • Fornecer modelos para o tratamento dessa marcação em sua transformação XSLT ou qualquer software que você use, o que simplesmente reproduz o que estava intocado, por exemplo, se você tiver que preservar <b>some text</b> como está, forneça um modelo para fazê-lo:

        <xsl:template match="h:b">
      <b>
        <xsl:apply-templates/>
      </b>
    </xsl:template/>
            

    (Se você estiver manipulando elementos de diferentes DTDs ou Schemas, provavelmente você precisará Namespaces para mantê-los distintos, daí o prefixo h: prefix.)

  • se a instrução 'deep copy' do XSLT, que faz com que a marcação bem definida seja aninhada, por exemplo

            <xsl:template match="h:b">
      <xsl:copy-of select="."/>
    </xsl:template/>
            
  • Como último recurso, use o atributo disable-output-escaping no elemento xsl:text do XSL [T] que está disponível em alguns processadores, por exemplo

            <xsl:text disable-output-escaping="yes"><![CDATA[<b>Now!</b>]]&gt;</xsl:text>
            

    Isso cai no departamento de "truques sujos", e geralmente é obsoleto. Alguns processadores não o suportam.

  • Alguns processadores (por exemplo, JX) agora estão fornecendo seus próprios equivalentes para desabilitar o escape de saída. Seus defensores afirmam que é "altamente desejável" ou "o que a maioria das pessoas quer", mas ainda precisa ser tratado com cuidado para evitar que o código arbitrário indesejado (possivelmente perigoso) seja passado intacto em seu sistema. Ele também adiciona outra dependência ao seu software.

Para obter mais detalhes sobre o uso dessas técnicas em XSL [T], consulte a questão relevante no XSL FAQ .

Leia Quando eu devo usar CDATA Marked Section? Também, que está intimamente relacionado.