You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Saxon XSLT如何将XML保存至eXist-db?

Saxon XSLT 保存XML到eXist-db的首选机制

你尝试的<xsl:result-document>指向HTTP地址不可行,因为Saxon默认不会将HTTP URI作为可写入目标,也不会自动发起POST请求提交内容。以下是几种可靠的实现方式:

1. 利用Saxon PE/EE的内置HTTP扩展(首选)

Saxon商业版(PE/EE)提供了http扩展模块,可直接在XSLT中发送HTTP请求,完美适配你的需求:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:http="http://saxon.sf.net/http"
    version="3.0">

<xsl:template match="/">
    <!-- 要保存的目标XML节点 -->
    <xsl:variable name="target-node" select="$node"/>
    
    <!-- 构造POST请求 -->
    <xsl:variable name="http-request" as="element(http:request)">
        <http:request method="POST" href="http://localhost:8080/exist/rest/db/winequest/mysave.xql">
            <http:header name="Content-Type" value="application/xml"/>
        </http:request>
    </xsl:variable>
    
    <!-- 发送请求并获取响应 -->
    <xsl:variable name="response" select="http:send-request($http-request, $target-node)"/>
    
    <!-- 可选:处理响应结果 -->
    <xsl:if test="http:response-code($response) != 200">
        <xsl:message>保存失败,响应码:<xsl:value-of select="http:response-code($response)"/></xsl:message>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

对应的mysave.xql可直接接收请求体中的XML并存储:

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

let $xml-content := request:get-body()
let $doc := parse-xml($xml-content)
return xmldb:store('/db/winequest', 'saved-document.xml', $doc)

2. 开源Saxon HE版本:通过Java扩展发送HTTP请求

如果使用免费的Saxon HE,可借助Java的HTTP客户端库(如Apache HttpClient),通过Saxon的Java扩展能力调用:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:java="http://saxon.sf.net/java-type"
    xmlns:http="java:org.apache.http.client.fluent.Request"
    xmlns:content-type="java:org.apache.http.entity.ContentType"
    version="3.0">

<xsl:template match="/">
    <xsl:variable name="target-node" select="$node"/>
    <xsl:variable name="xml-string" select="xml-to-string($target-node)"/>
    
    <!-- 发送POST请求 -->
    <xsl:variable name="response" select="http:Post('http://localhost:8080/exist/rest/db/winequest/mysave.xql')
        => bodyString($xml-string, content-type:APPLICATION_XML)
        => execute()
        => returnResponse()"/>
    
    <!-- 检查响应状态 -->
    <xsl:if test="java:getStatusCode($response) != 200">
        <xsl:message>保存失败,状态码:<xsl:value-of select="java:getStatusCode($response)"/></xsl:message>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

注意:需将Apache HttpClient的JAR包加入类路径,同时确保Saxon配置允许调用Java扩展。

3. 直接调用eXist-db的原生REST API

eXist-db原生REST API支持直接PUT文档到指定路径,无需自定义XQuery。可直接发送PUT请求到http://localhost:8080/exist/rest/db/winequest/my-new-doc.xml,请求体为XML内容,结合上述两种HTTP请求方法即可实现。


内容的提问来源于stack exchange,提问作者lschult2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:45:19