为 MySQL 配置 Saxon

问题描述 投票:0回答:1

我在将 Saxon 配置为在 oXygen 和 eXist-db 中使用 MySQL 时遇到困难。这是我在 eXist-db xquery 中的尝试。没有错误,我确实得到了一个连接对象(因此从 my.cnf 中提取的字段似乎确实有效),但

sql:execute()
没有返回任何结果。有什么建议吗?

xquery version "3.1";
declare namespace transform="http://exist-db.org/xquery/transform";

let $xml := <root/>
let $xsl := <xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:file="http://expath.org/ns/file"
    xmlns:wq="https://winequest.com"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:sql="http://saxon.sf.net/sql"
    exclude-result-prefixes="file wq xs map sql"
    version="3.0" expand-text="yes">
    <xsl:mode on-no-match="shallow-copy"/>
    
    <xsl:template match="/">
        <xsl:variable name="cnf" select="file:read-text('/etc/my.cnf')"/>
        <xsl:variable name="client" select="$cnf =&gt; replace('^.*\[client\]', '', 's') =&gt; replace('\[[^\]]+\].*$', '', 's')" as="xs:string"/>
        <xsl:variable name="host" select="analyze-string($client, 'host\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="database" select="analyze-string($client, 'database\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="user" select="analyze-string($client, 'user\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="password" select="analyze-string($client, 'password\s+=\s+(.*)')/*:match/*:group/text()" as="xs:string"/>
        <xsl:variable name="connection-map" select="map{{   'database':'jdbc:mysql://'||$host||':3306/'||$database||'?serverTimezone=America/Los_Angeles',   'driver':'com.mysql.jdbc.Driver',   'user':$user,   'password':$password,   'autoCommit':true()}}"/>
        <xsl:variable name="connection" select="sql:connect($connection-map)"/>
        <sql-results>
            <xsl:sequence select="sql:execute($connection, 'SHOW DATABASES')"/>
        </sql-results>
    </xsl:template>
</xsl:stylesheet>

let $parameters := 
    <parameters>
        <param name="exist:stop-on-error" value="yes"/>
    </parameters>

let $config := 
    <configuration xmlns="http://saxon.sf.net/ns/configuration">
        <xslt>
            <extensionElement namespace="http://saxon.sf.net/sql" factory="net.sf.saxon.option.sql.SQLElementFactory"/>
        </xslt>
    </configuration>

let $results := transform:transform($xml, $xsl, $parameters, $config, ())
return $results
mysql saxon exist-db
1个回答
0
投票

sql:execute()
的文档说它没有返回任何结果,因此它似乎按设计工作。它旨在允许执行 SQL 命令,以消除其副作用(如
DROP TABLE
)。

我不确定

SHOW DATABASE
命令如何在 JDBC 级别运行。我猜您会先拨打
Statement.execute()
,然后再拨打
Statement.getResultSet()
。不幸的是,我认为 Saxon 的 SQL 函数库中没有任何与此完全对应的内容。

© www.soinside.com 2019 - 2024. All rights reserved.