如何使用XSL模板清理Mysql查询?

时间:2013-05-23 08:03:52

标签: mysql xml xslt sanitize

我有一个XML文件的XSL关联。这个XSL旨在创建Mysql查询,但在我的XML中,我有一些像apostroph这样的特殊字符,这会打破我的查询。你知道如何清理我的XSL模板以获得安全的查询吗?

我的XML文件示例

<?xml version="1.0" encoding="utf-8"?>  
<?xml-stylesheet type="text/xsl" href="fnac.xsl"?>
<products xmlns="http://zanox.com/productdata/exportservice/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://zanox.com/productdata/exportservice/v1 http://productdata.zanox.com/exportservice/schema/export-1.1.xsd">
  <product>
    <name>jack o'connor</name>
    <program>3467</program>
  </product>
</products> 

我的XSL文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v1="http://zanox.com/productdata/exportservice/v1">
<xsl:output method="text" omit-xml-declaration="yes"/>

<xsl:template match="/">
    <xsl:apply-templates select="//v1:product"/>
</xsl:template>

<xsl:template match="v1:product">
<xsl:text>insert into fnac (name, program) values(</xsl:text>
<xsl:value-of select="./v1:name"/>
<xsl:text>,'</xsl:text>
<xsl:value-of select="./v1:program"/>
<xsl:text>'); </xsl:text>
</xsl:template>

</xsl:stylesheet>

感谢您的投入!

2 个答案:

答案 0 :(得分:0)

如果要从XML文件中删除apostrope,则应使用此xslt:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v1="http://zanox.com/productdata/exportservice/v1">
  <xsl:output method="text" omit-xml-declaration="yes"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//v1:product"/>
  </xsl:template>

  <xsl:template match="v1:product">
    <xsl:text>insert into fnac (name, program) values(</xsl:text>
    <xsl:call-template name="replace-string">
      <xsl:with-param name="text" select="./v1:name"/>
      <xsl:with-param name="from">'</xsl:with-param>
      <xsl:with-param name="to" select="' '"/>
    </xsl:call-template>
    <xsl:text>,'</xsl:text>
    <xsl:value-of select="./v1:program"/>
    <xsl:text>'); </xsl:text>
  </xsl:template>


  <xsl:template name="replace-string">
    <xsl:param name="text"/>
    <xsl:param name="from"/>
    <xsl:param name="to"/>
    <xsl:choose>
      <xsl:when test="contains($text, $from)">
        <xsl:variable name="before" select="substring-before($text, $from)"/>
        <xsl:variable name="after" select="substring-after($text, $from)"/>
        <xsl:copy-of select="$before"/>
        <xsl:value-of select="$to" disable-output-escaping="yes"/>
        <xsl:call-template name="replace-string">
          <xsl:with-param name="text" select="$after"/>
          <xsl:with-param name="from" select="$from"/>
          <xsl:with-param name="to" select="$to"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

会产生输出:

insert into fnac (name, program) values(jack o connor,'3467'); 

答案 1 :(得分:0)

如果您只喜欢/需要更换使用者,translate()可以更轻松地完成此任务。
试试这个:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:v1="http://zanox.com/productdata/exportservice/v1">
    <xsl:output method="text" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//v1:product"/>
    </xsl:template>

    <xsl:template match="v1:product">
        <xsl:text>insert into fnac (name, program) values(</xsl:text>
        <xsl:value-of select='translate(./v1:name,"&apos;", " ")'/>
        <xsl:text>,'</xsl:text>
        <xsl:value-of select="./v1:program"/>
        <xsl:text>'); </xsl:text>
    </xsl:template>

</xsl:stylesheet>