Desinfizierung von DB -Eingaben mit XSLT
-
26-09-2019 - |
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
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 ...
- Sie können kein Namensattribut für ein Tag-Templates-Tag haben.
- 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>