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
相关产品推荐
相关产品推荐

