Saxon XSLT连接SQLite时HTML内容丢失问题求助
解决方案
1. 修正XSLT生成SQL语句的逻辑,保留HTML标签并正确转义
你提到变量$text包含完整HTML,但插入后丢失标签,大概率是生成INSERT语句时误将HTML节点转成了纯文本,或者未正确处理SQL字符串转义。
用Saxon支持的serialize()函数将HTML节点序列化为字符串,再对SQL特殊字符(单引号)做转义:
<!-- 将HTML节点序列化为字符串 --> <xsl:variable name="html-content" select="serialize($text, method='html')"/> <!-- 转义SQL中的单引号(SQLite用两个单引号表示转义) --> <xsl:variable name="escaped-html" select="replace($html-content, '''', '''''')"/> <!-- 生成INSERT语句 --> <xsl:text>INSERT INTO your_table (txt_string) VALUES ('</xsl:text> <xsl:value-of select="$escaped-html"/> <xsl:text>');</xsl:text>
serialize($text, method='html')会保留所有HTML标签和结构;replace()处理单引号转义,避免SQL语法错误。
2. 使用Saxon SQL扩展直接操作数据库(更安全)
手动生成SQL容易出错,推荐用Saxon的sql扩展模块直接绑定参数插入,自动处理转义:
- 引入命名空间:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sql="http://saxon.sf.net/sql">
- 建立SQLite连接:
<sql:connect driver="org.sqlite.JDBC" database="jdbc:sqlite:your_database.db"> <sql:user name="" password=""/> </sql:connect>
- 序列化HTML并插入:
<xsl:variable name="html-string" select="serialize($text, method='html')"/> <sql:insert table="your_table"> <sql:column name="txt_string" select="$html-string"/> </sql:insert>
注意:需要将SQLite JDBC驱动(如sqlite-jdbc-x.x.x.jar)加入Saxon的类路径。
3. 切换到XML数据库(如eXist-db)的场景
如果你的业务经常需要基于HTML结构查询数据(比如定位某个标签下的内容),切换到eXist-db这类XML数据库会更高效:
- 直接将解析后的HTML节点(或转换为XHTML)存入数据库,无需转成字符串;
- 用XPath直接查询HTML结构,避免字符串解析的麻烦;
- 天然支持XML/HTML的层级存储,无需处理转义问题。
内容的提问来源于stack exchange,提问作者Paulb
相关产品推荐
相关产品推荐

