0

我有一个与 XML 文件关联的 XSL。这个 XSL 旨在创建 Mysql 查询,但在我的 XML 中,我有一些特殊字符,例如撇号 ',它们会破坏我的查询。您知道如何清理我的 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>

感谢您的投入!

4

2 回答 2

0

如果你想从你的 XML 文件中删除撇号,你应该使用这个 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'); 
于 2013-05-23T08:40:31.497 回答
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>
于 2013-05-23T14:43:43.347 回答