Frage

Ich habe nach einer Methode gesucht, um meinen XML -Inhalt von Apostrophes (') zu entfernen, da mein DBMS über die Empfangen von diesen beschwert wird.

Ich brauche

<name> Jim O'Connor</name>

werden:

<name> Jim O''Connor</name>

Durch Betrachtung des beschriebenen Beispiels hier, das soll ersetzen ' mit '', Ich habe das folgende Skript konstruiert:

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output omit-xml-declaration="yes" indent="yes" />

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

      <xsl:template name="sqlApostrophe">
        <xsl:param name="string" />
        <xsl:variable name="apostrophe">'</xsl:variable>
        <xsl:choose>
          <xsl:when test="contains($string,$apostrophe)">
            <xsl:value-of select="concat(substring-before($string,$apostrophe), $apostrophe,$apostrophe)"
            disable-output-escaping="yes" />
            <xsl:call-template name="sqlApostrophe">
              <xsl:with-param name="string"
              select="substring-after($string,$apostrophe)" />
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$string"
            disable-output-escaping="yes" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>

      <xsl:template match="text()">
        <xsl:call-template name="sqlApostrophe">
          <xsl:with-param name="string" select="."/>
        </xsl:call-template>
      </xsl:template>

    </xsl:stylesheet>

Update: Es funktioniert gut

Danke für Ihre Hilfe

War es hilfreich?

Lösung

Das Hauptproblem liegt in Ihrer letzten Vorlage. Als Dacracot weist darauf hin, xsl:apply-templates Nimmt keine name Attribut. Um eine benannte Vorlage anzurufen, würden Sie verwenden xsl:call-template.

Wenn Sie Ihre SQL -Flucht auf alle Textknoten anwenden möchten, können Sie versuchen, Ihre letzte Vorlage durch so etwas zu ersetzen:

<xsl:template match="text()">
  <xsl:call-template name="sqlApostrophe">
    <xsl:with-param name="string" select="."/>
  </xsl:call-template>
</xsl:template>

Auch warum disable-output-escaping? Wenn der Text Sonderzeichen enthält (<, >, &) Sie werden als Ausgabe missgebildet.

Andere Tipps

Sie haben ein paar Probleme syntaktisch ...

  1. Sie können kein Namensattribut für ein Tag-Templates-Tag haben.
  2. Ihr XPath, "node () |@*", ist mehrdeutig.

Haben Sie dies durch einen Debugger geführt? Ich würde Sauerstoff vorschlagen.

Gibt es einen Grund, eine separate Vorlage für den Austausch aufzurufen? Welchen Prozessor verwenden Sie? Sie sollten in der Lage sein, den Austausch in der match="text()" Schablone.

Dies funktioniert für mich mit Saxon 9-er:

Eingabe xml:

<?xml version="1.0" encoding="UTF-8"?>
<name> Jim O'Connor</name>

Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output indent="yes"/>

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

    <xsl:template match="text()">
        <xsl:value-of select="replace(data(.),'''','''''')"/>
    </xsl:template>

</xsl:stylesheet>

Ausgabe xml:

<?xml version="1.0" encoding="UTF-8"?>
<name> Jim O''Connor</name>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top