使用 XSLT 清理数据库输入

发布于 2024-09-01 10:06:17 字数 1915 浏览 8 评论 0原文

我一直在寻找一种方法来去除 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倾城月光淡如水﹏ 2024-09-08 10:06:17

主要问题出在您的最后一个模板中。正如 dacracot 指出xsl:apply-templates< /code> 不采用 name 属性。要调用命名模板,您可以使用xsl:call-template

如果您想将 SQL 转义应用到所有文本节点,您可以尝试用如下内容替换最后一个模板:

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

另外,为什么disable-output-escaping?如果文本包含特殊字符(<>&),您将得到格式错误的 XML 作为输出。

The main problem is in your last template. As dacracot points out, xsl:apply-templates does not take a name attribute. To call a named template, you'd use xsl: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:

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

Also, why disable-output-escaping? If the text contains special characters (<, >, &), you'll get malformed XML as the output.

眼眸里的那抹悲凉 2024-09-08 10:06:17

你在语法上有几个问题......

  1. 你不能在 apply-templates 标签上有 name 属性。
  2. 您的 xpath“node()|@*”不明确。

你通过调试器运行过这个吗?我建议使用氧气。

You have a couple of issues syntactically...

  1. You can't have a name attribute on an apply-templates tag.
  2. Your xpath, "node()|@*", is ambiguous.

Have you run this through a debugger? I would suggest Oxygen.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文