2009-12-16 6 views
3

J'ai un fichier XML qui est transformé avec XSL. Certains éléments doivent être modifiés, d'autres doivent être laissés tels quels - en particulier, du texte avec des entités & quot;, & amp;, & apos;, & lt;, & gt; devrait être laissé tel quel, et dans mon cas & quot; et & apos; sont modifiés en " et ' en conséquence.Transformation XSL et entités XML spéciales s'échappant

test XML:

<?xml version="1.0" encoding="UTF-8" ?> 
<root> 
    <element> 
     &quot; 
     &amp; 
     &apos; 
     &lt; 
     &gt; 
    </element> 
</root> 
fichier de transformation

:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="no" indent="no" /> 
    <xsl:template match="element"> 
     <xsl:copy> 
      <xsl:value-of disable-output-escaping="no" select="." /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

résultats:

<?xml version="1.0" encoding="UTF-8"?> 
    <element> 
     " 
     &amp; 
     ' 
     &lt; 
     &gt; 
    </element> 

résultat souhaité:

<?xml version="1.0" encoding="UTF-8"?> 
    <element> 
     &quot; 
     &amp; 
     &apos; 
     &lt; 
     &gt; 
    </element> 

J'ai 2 questions:

  • pourquoi certaines de ces entités sont transformées et d'autres pas?
  • comment puis-je obtenir le résultat souhaité?

Répondre

3

La raison en est que <, > et & doit toujours être échappèrent en XML. Ils ont une signification particulière en XML, ils doivent donc être traités spécialement s'ils font partie des données (au lieu du balisage).

Les deux autres, ' et ", peut être échappé, leurs noms d'entités sont connues au format XML (principalement, pour permettre aux valeurs d'attributs qui fonctionne correctement, comme ceci:

<xml ackbar="He said, &quot;It's a trap!&quot;" /> 
<xml ackbar='He said, "It&apos;s a trap!"' /> 

Dans tous les endroits où leur échapper n'est pas absolument nécessaire, ils peuvent se produire littéralement

L'ensemble d'informations qui en résulte (par exemple sous la forme d'un DOM) sera exactement le même, et vous ne devriez pas trop se soucier qu'ils se produisent littéralement ou en tant qu'entité dans le Fichier XML:

En fait, toutes vos données peuvent se produire sous forme d'échappement (entités numérotées, comme dans &#10;) sans modifier le document réel - seule la représentation sérialisée diffère.

Tant que vous travaillez avec des outils compatibles XML (par exemple, les analyseurs DOM), vous ne remarquerez jamais de différence. Corollaire: Si vous ne travaillez pas avec des outils compatibles avec XML (par exemple, la regex ou la manipulation de chaînes de caractères), vous devriez arrêter cela immédiatement.;-)

+0

S'il vous plaît examiner le « résultat désiré: » Une partie de ma question - il n'a pas été rendu correctement, donc je l'a édité. – NSPKUWCExi2pr8wVoGNk

+0

Cela n'affecte cependant pas ma réponse. ;-) Je peux être plus explicite: Vous ne pouvez probablement pas obtenir le résultat désiré, et dans tous les cas - vous ne devriez pas * vous inquiéter * de la façon dont les guillemets simples ou doubles sont rendus dans le fichier XML. – Tomalak

+0

Semble qu'il n'y a pas d'autres opinions et cette réponse est très instructif, donc je vais l'accepter. Je vous remercie. – NSPKUWCExi2pr8wVoGNk

0

Vous pouvez toujours l'esperluette d'origine, en substance, il avait l'air quelque chose comme

&amp;quot;