web-dev-qa-db-fra.com

comment échapper à une seule citation dans la fonction sous-chaîne xslt

J'ai essayé de sous-chaîne des données avec guillemets simples dans XSLT:

String : DataFromXML:'12345'

résultat attendu: 12345

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:')"/>

Résultat: '12345'

j'ai essayé ci-dessous le code 

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&#39;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:&apos;')"/>

<xsl:value-of select="substring-after('$datafromxml','DataFromXML:'')"/>

Erreur:

String literal was not closed 'DataFromXML:'--->'<---
23
buttowski

Les règles générales pour s'échapper sont les suivantes:

En 1.0: 

  • si vous souhaitez que le délimiteur d'attribut soit un littéral de chaîne, utilisez le formulaire XML escape &quot; ou &apos;
  • si vous voulez le délimiteur de chaîne dans un littéral de chaîne, vous êtes bloqué

En 2.0:

  • si vous souhaitez que le délimiteur d'attribut soit un littéral de chaîne, utilisez le formulaire XML escape &quot; ou &apos;
  • si vous voulez le délimiteur de chaîne dans un littéral de chaîne, doublez-le (pour exemple, 'je ne peux pas')

L'utilisation d'une variable $ quot ou $ apos comme indiqué par Vitaliy peut rendre le code beaucoup plus clair.

23
Michael Kay

Cela devrait fonctionner:

<xsl:variable name="apos">'</xsl:variable>

...

<xsl:value-of select="substring-before(substring-after($datafromxml, concat('DataFromXML:', $apos)), $apos)" />
10
Vitaliy

Vous pouvez essayer d’échanger et "et" dans votre xsl: value-of

<xsl:value-of select='substring-before
   (substring-after($datafromxml,"DataFromXML:&apos;"), "&apos;")'/> 

Vous pouvez également utiliser la fonction de traduction pour supprimer les apostrophes embêtants.

 <xsl:value-of select='translate
    (substring-after($datafromxml,"DataFromXML:"), "&apos;", "")'/> 

Pas nécessairement plus agréable, mais cela supprime le besoin d'une variable. 

8
Tim C

Même dans le cas le plus compliqué - la chaîne contient à la fois une citation et une apostrophe - le nombre peut être extrait sans recourir à des variables .

Supposons que nous ayons ce document XML:

<t>' "12345' "</t>

et veulent extraire juste le nombre.

Dans la transformation suivante, nous utilisons une seule expression XPath pour faire exactement cela:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()">
     <xsl:value-of select=
     'substring-after(.,"&apos;")
     '/>
==============  
     <xsl:value-of select=
     'substring-before(
       substring-after(substring-after(.,"&apos;"), &apos;&quot;&apos;),
       "&apos;"
                       )
     '/>
 </xsl:template>
</xsl:stylesheet>

Le résultat est :

 "12345' "
==============  
     12345

Note : J'ai intentionnellement deux expressions XPath - le but de la première est de simplifier la compréhension de ce qui est exprimé dans la seconde expression XPath. Ne laisser que le dernier xsl:value-of dans le corps du modèle produit exactement le résultat souhaité:

12345
4
Dimitre Novatchev

Juste une note à mon futur moi (ou à toute autre personne) qui bénéficierait d'un rappel de la syntaxe exacte qui a fonctionné pour moi .

Déclarer cette variable

<xsl:variable name="apos" select='"&apos;"'/>

Et utilisez-le dans un état comme celui-ci

<xsl:if test="$value = concat('G-2', $apos, 'd')">89594</xsl:if>
0
NickBeaugié