2009-02-10 6 views
2

Je travaille sur une transformation XSLT pour réorganiser les blocs XML afin de valider les fichiers NewsML. Certains de ces fichiers contiennent des caractères codés (tels que & amp; & quot; etc ...). Le problème est que la transformation XSLT convertit ces caractères en leur chaîne littérale (ie "et", "'"). Cela cause des problèmes. Je ne veux pas que cela arrive.Conversion automatique des caractères échappés en littéraux de chaîne

Je l'ai expérimenté diverses techniques (utilisation de < xsl: text >, < xsl: value-of > et le drapeau d'échappements sortie désactiver, < xsl: méthode de sortie = 'xml | html | xhtml | texte' >) en vain. Ces méthodes, soit convertir les caractères, ou simplement les laisser dehors.

par exemple, une chaîne qui commence par "étoiles sur PM & amp; apos; cartes de" peuvent finir comme

  • étoiles sur les cartes de PM
  • étoiles sur les cartes PMs

J'utilise l'application de traitement Saxonica (http://www.saxonica.com/).

La base XSLT que j'utilise est fournie ci-dessous. (Il y a d'autres choses, mais le problème existe même avec cette simple feuille de style)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Toutes les idées sur la façon d'éviter cette conversion serait très appréciée. L'exigence est de conserver le texte original tel qu'il apparaît.

Répondre

1

Je pense que vous devez faire à la fois le disable-output-escaping = "yes" et définir le document au format HTML en même temps.

du W3C (mine d'importance):

Il est une erreur pour les échappements est désactivé pour un nœud de texte qui est utilisé pour autre chose qu'un nœud de texte dans l'arborescence du résultat. Ainsi, c'est une erreur de désactiver l'échappement de sortie pour un élément de texte xsl: value-of ou xsl: utilisé pour générer la valeur de chaîne d'un commentaire, d'une instruction de traitement ou d'un noeud d'attribut; c'est aussi une erreur de convertir un fragment d'arbre de résultat en un nombre ou une chaîne si le fragment d'arbre de résultat contient un nœud de texte pour lequel l'échappement a été désactivé. Dans les deux cas, un processeur XSLT peut signaler l'erreur; s'il ne signale pas l'erreur, il doit récupérer en ignorant l'attribut disable-output-escaping. L'attribut disable-output-escaping peut être utilisé avec la méthode de sortie html ainsi qu'avec la méthode de sortie xml. La méthode de sortie de texte ignore l'attribut disable-output-escaping, car elle n'effectue pas d'échappement en sortie.

Un processeur XSLT ne pourra désactiver l'échappement en sortie que s'il contrôle la sortie de l'arborescence des résultats. Ce n'est peut-être pas toujours le cas. Par exemple, l'arborescence des résultats peut être utilisée comme arbre source pour une autre transformation XSLT au lieu d'être sortie. Un processeur XSLT n'est pas nécessaire pour prendre en charge la désactivation de l'échappement en sortie. Si un texte xsl: value-of ou xsl: spécifie que l'échappement en sortie doit être désactivé et que le processeur XSLT ne le prend pas en charge, le processeur XSLT peut signaler une erreur; si elle ne signale pas une erreur, elle doit être restaurée en ne désactivant pas la sortie qui s'echappe.

Si l'échappement en sortie est désactivé pour un caractère qui n'est pas représentable dans le codage que le processeur XSLT utilise pour la sortie, le processeur XSLT peut signaler une erreur; si elle ne signale pas une erreur, elle doit être restaurée en ne désactivant pas la sortie qui s'echappe.

Étant donné que la désactivation de l'échappement de sortie peut ne pas fonctionner avec tous les processeurs XSLT et que le XML peut ne pas être correctement formé, il doit être utilisé uniquement lorsqu'il n'y a pas d'alternative.

+0

/> Je reçois des résultats étranges: " -> " & -> & ' -> ' < -> < > -> > Comme vous pouvez le voir - que quelques-unes des entités ont été échappé. – NSPKUWCExi2pr8wVoGNk

1

Ce sont entities. Habituellement they get mapped à une représentation unicode de cette entité. Le flux final ne contiendra que les caractères. Si vous produisez le flux, c'est au serializer d'échapper les caractères en fonction du type de sortie (ce que vous pouvez désactiver avec disable-output-escape). Ainsi, un sérialiseur approprié devrait tourner cette

<xsl:output method="html" encoding="UTF-8"/> 
<xsl:text>some&#160;test</xsl:text> 

dans

some&nbsp;test 

Voir la section 5 sur this article.

Donc, je voudrais d'abord vérifier cela avec votre processeur XSLT. Utilisation de Xalan version 2.7.1 et

Questions connexes