2010-12-13 3 views
0

Je suis le traitement du XML (exemple):XSL court `value-of` avec` disable-output-escaping`?

<?xml version="1.0"?> 
<root>&amp; &amp; &amp;</root> 

par ce qui suit (exemple) XSL:

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0"> 
    <xsl:output 
    method="html" 
    version="4.0" 
    encoding="UTF-8" 
    omit-xml-declaration="yes" 
    /> 
    <xsl:template match="/"> 
    <input value="{/root}" /> 
    </xsl:template> 
</xsl:stylesheet> 

en utilisant Python et lxml (libxslt-1.1.17), et je reçois ce qui suit sortie:

<input value="&amp;amp; &amp;amp; &amp;amp;" /> 

Je comprends que je peux contourner ce avec le modèle suivant:

<xsl:template match="/"> 
    <input> 
     <xsl:attribute name="value"> 
     <xsl:value-of 
      select="/root" 
      disable-output-escaping="yes" 
      /> 
     </xsl:attribute> 
    </input> 
    </xsl:template> 

mais c'est un lot de taper. Ayant travaillé avec XSL au sein de PHP, je ne me souviens pas avoir jamais eu à utiliser cette solution de contournement pour ne plus citer d'entités XML en utilisant le raccourci value-of. Y a-t-il une solution à ce problème, alors nous ne devons pas continuer à taper tout ce qui précède?

+1

Je ne peux pas reproduire votre problème. Etes-vous sûr que votre exemple de saisie et feuille de style sont complets et démontrent réellement le problème (au moins la feuille de style ne contient pas la déclaration d'espace de noms «xsl»)? La transcription de la session est disponible ici: http://pastebin.com/rbMhBXRm –

+0

Votre source d'entrée a trois caractères & ampersand, qu'ils sont encodés comme des entités de caractères (comme il se doit). Il n'y a aucun moyen que cela soit produit sous la forme d'un "encodage HTML" comme "& amp;" à moins qu'il ne s'agisse d'entités de caractères en premier lieu mais de cinq caractères "&" comme dans une section CDATA. –

Répondre

1

DOE en fait est conçu pour de tels cas. Désolé, si vous le savez, juste pour être consécutif.

http://www.w3.org/TR/xslt#disable-output-escaping

Normalement, la méthode de sortie xml échappe & et < (et éventuellement d'autres caractères) lors de la sortie des noeuds de texte. Cela garantit que la sortie est bien formée en XML. Cependant, il est parfois pratique de pouvoir produire une sortie qui est presque, mais pas assez bien formée en XML; par exemple, la sortie peut inclure des sections mal formées qui sont destinées à être transformées en XML bien formé par un processus ultérieur non-XML. Pour cette raison, XSLT fournit un mécanisme pour désactiver l'échappement de sortie. Xsl: value-of ou xsl: élément de texte peut avoir un attribut disable-output-escaping ...

Je pense que la vraie douleur est que vous ne peut pas utiliser DOE dans l'expression de attribuiez valeur, par exemple {disable-output-escaping(root)}.

Donc, je ne peux pas penser à aucun moyen de raccourcir cela.

+0

Lisez de plus près la question. Pouvez-vous reproduire le problème? Je pense que tu ne peux pas. –

+0

@Alejandro. Oops. J'ai répondu principalement à la question "Existe-t-il une solution à ce problème, alors nous ne devons pas continuer à taper tout ce qui précède?" partie. Vous pouvez downvote. – Flack