wake-up-neo.net

wie kann man das einfache Anführungszeichen in der Xslt-Teilzeichenfolge umgehen?

Ich habe versucht, Daten mit einem einfachen Anführungszeichen in XSLT zu unterteilen:

String : DataFromXML:'12345'

erwartetes Ergebnis: 12345

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

Ergebnis: '12345'

ich habe unter Code versucht 

<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:'')"/>

Error:

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

Die allgemeinen Regeln für die Flucht sind:

In 1.0: 

  • wenn das Attributtrennzeichen in einem Zeichenfolgenliteral enthalten sein soll, verwenden Sie das XML Escape-Formular &quot; oder &apos;
  • wenn Sie den String-Begrenzer in einem String-Literal verwenden möchten, werden Sie abgespritzt

In 2.0:

  • wenn das Attributtrennzeichen in einem Zeichenfolgenliteral enthalten sein soll, verwenden Sie das XML Escape-Formular &quot; oder &apos;
  • wenn Sie den String-Begrenzer in einem String-Literal verwenden möchten, doppelten Sie ihn (für Beispiel "Ich kann nicht").

Die Verwendung einer Variablen "$ quot" oder "$ apos", wie von Vitaliy gezeigt, kann den Code viel klarer machen.

23
Michael Kay

Das sollte funktionieren:

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

...

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

Sie könnten versuchen, und "und" in Ihrer xsl: value-of zu tauschen.

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

Alternativ können Sie die Übersetzungsfunktion verwenden, um die lästigen Apostrophe zu entfernen

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

Nicht unbedingt schöner, beseitigt jedoch die Notwendigkeit einer Variablen. 

8
Tim C

Selbst im kompliziertesten Fall - die Zeichenfolge enthält sowohl ein Zitat als auch ein Apostroph - kann die Zahl extrahiert werden, ohne auf Variablen zurückzugreifen .

Angenommen, wir haben dieses XML-Dokument:

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

und will nur die Nummer extrudieren.

In der folgenden Transformation verwenden wir einen einzelnen XPath-Ausdruck, um genau das zu tun:

<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>

Das Ergebnis ist :

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

Bitte beachten Sie : Ich habe absichtlich zwei XPath-Ausdrücke. Der erste soll die Verständlichkeit dessen, was im zweiten XPath-Ausdruck ausgedrückt wird, vereinfachen. Wenn Sie nur den letzten xsl:value-of im Vorlagenkörper belassen, erhalten Sie genau das gewünschte Ergebnis:

12345
4

Nur ein Hinweis an mein zukünftiges Selbst (oder irgendjemand anderes), der von einer Erinnerung an die genaue Syntax profitieren würde, die für mich funktionierte .

Deklarieren Sie diese Variable

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

Und verwenden Sie es in einem solchen Zustand

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