使用 XSLT 清理数据库输入
我一直在寻找一种方法来去除 XML 内容中的撇号 ('),因为我的 DBMS 抱怨收到了这些撇号。
我需要
<name> Jim O'Connor</name>
成为:
<name> Jim O''Connor</name>
通过查看此处描述的示例,应该用 ''
替换 '
,我构建了以下脚本:
<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>
更新:它工作正常
感谢您的帮助
I've been looking for a method to strip my XML content of apostrophes (') since my DBMS is complaining of receiving those.
I need
<name> Jim O'Connor</name>
to become:
<name> Jim O''Connor</name>
By looking at the example describedhere, that is supposed to replace '
with ''
, I constructed the following script:
<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: it works fine
Thanks for your help
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
主要问题出在您的最后一个模板中。正如 dacracot 指出,
xsl:apply-templates< /code> 不采用
name
属性。要调用命名模板,您可以使用xsl:call-template
。如果您想将 SQL 转义应用到所有文本节点,您可以尝试用如下内容替换最后一个模板:
另外,为什么
disable-output-escaping
?如果文本包含特殊字符(<
、>
、&
),您将得到格式错误的 XML 作为输出。The main problem is in your last template. As dacracot points out,
xsl:apply-templates
does not take aname
attribute. To call a named template, you'd usexsl:call-template
.If you want to apply your SQL escaping to all text nodes, you could try replacing your last template with something like this:
Also, why
disable-output-escaping
? If the text contains special characters (<
,>
,&
), you'll get malformed XML as the output.你在语法上有几个问题......
你通过调试器运行过这个吗?我建议使用氧气。
You have a couple of issues syntactically...
Have you run this through a debugger? I would suggest Oxygen.