2017-11-09 5 views
0

Ich habe versucht, das mit replace($val, 'amp;', '') zu tun, aber scheint wie & Atomeinheit zum Parser ist. Irgendwelche anderen Ideen?Ist es möglich, & durch & in XSLT zu ersetzen?

Ich brauche es, um doppelte Entweichen loszuwerden, also habe ich Konstruktionen wie ᾰ in der Eingabedatei.

UPD: Auch ein wichtiger Hinweis: Ich muss diese Ersetzung nur innerhalb bestimmter Tags, nicht innerhalb jedes Tags vornehmen.

+0

Was ist das Ergebnisformat, auch XML oder HTML oder einfacher Text? Da Sie scheinbar 'ersetzen 'haben, benutzen Sie mindestens einen XSLT 2 Prozessor, also prüfen Sie, ob Zeichenkarten helfen https://www.w3.org/TR/xslt-30/#character-maps –

+0

Endergebnis ist * .html Datei mit 'http: // www.w3.org/1999/xhtml' Namensraum, aber ich bin gezwungen, XML-Ausgabemethode aus anderen Gründen zu verwenden –

Antwort

1

Wenn Sie es serialisiert ist immer (falls unterstützt) die disable-output-escaping Hack finden http://xsltransform.hikmatu.com/nbUY4kh die verwandelt

<root> 
    <foo>a &amp; b</foo> 
    <bar>a &amp; b</bar> 
</root> 

selektiv in

<root> 
    <foo>a & b</foo> 
    <bar>a &amp; b</bar> 
</root> 

von <xsl:value-of select="." disable-output-escaping="yes"/> mit in die Vorlage foo/text() passend :

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="foo/text()"> 
     <xsl:value-of select="." disable-output-escaping="yes"/> 
    </xsl:template> 
</xsl:transform> 

Um dieselbe selektive Ersetzung mit einer Zeichentabelle zu erreichen, können Sie das unter footext() untergeordnete Zeichen (oder gegebenenfalls Abkömmlinge) durch ein Zeichen ersetzen, das an keiner anderen Stelle in Ihrem Dokument verwendet wird. Verwenden Sie dann die Karte, um es einem nichtskapierten kaufmännischen Und-Zeichen zuzuordnen:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output use-character-maps="doe"/> 

    <xsl:character-map name="doe"> 
     <xsl:output-character character="«" string="&amp;"/> 
    </xsl:character-map> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="foo/text()"> 
     <xsl:value-of select="replace(., '&amp;', '«')"/> 
    </xsl:template> 

</xsl:transform> 

auf diese Weise

<root> 
    <foo>a &amp; b</foo> 
    <bar>a &amp; b</bar> 
</root> 

auch

<root> 
    <foo>a & b</foo> 
    <bar>a &amp; b</bar> 
</root> 
transformiert wird

sehenfür eine Probe.

+0

genial, danke –

1

Wenn Ihr XML & # 8112 enthält; und Sie glauben, dass dies eine doppelte Escape-Darstellung des Zeichens mit Codepoint 8112, dann können Sie es in diesen Charakter konvertieren mit dem XPath-Ausdruck

codepoints-to-string(xs:integer(replace($input, '&#([0-9]+);', $1))) 

daran erinnern, dass, wenn Sie schreiben, um diesen XPath-Ausdruck in XSLT, dann ist der & muss als &amp; geschrieben werden.

Verwandte Themen