将<p:xslt>的输出提供到Xproc中的HTTP PUT请求的<c:body> </c:body> </p:xslt>

时间:2015-03-31 21:51:32

标签: xml xslt-1.0 xquery xproc

下面我的Xproc管道的目标是接受源XML文档,使用<p:xslt>步骤运行2个XSLT转换,然后在第二个<p:xslt>之后将输出XML提供给{{1} } <c:body>步骤:

<p:http-request>

有没有办法实现这个目标?当我按原样尝试执行此代码时,首先调用<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0"> <p:input port="source" primary="true"/> <p:output port="result" primary="true"/> <p:serialization port="result" indent="false" method="xml" encoding="utf-8" omit-xml-declaration="false" doctype-system="myDTD.dtd" doctype-public="-//DOCTYPE-HERE"/> <p:xslt> <p:input port="stylesheet"> <p:document href="XSLT-1.xslt"/> </p:input> </p:xslt> <p:xslt> <p:input port="stylesheet"> <p:document href="XSLT-2.xslt"/> </p:input> </p:xslt> <p:http-request omit-xml-declaration="false" encoding="UTF-8"> <p:input port="source"> <p:inline> <c:request href="http://localhost:80/myRESTserver/dburi/myDOC.xml" auth-method="basic" username="user" password="admin" method="put"> <c:body content-type="text/xml" > </c:body> </c:request> </p:inline> </p:input> </p:http-request> (将空XML文件PUTS到数据库中)。

1 个答案:

答案 0 :(得分:3)

p:http-request首先运行的原因是它不依赖于管道中的任何其他步骤。 source的{​​{1}}输入端口绑定到静态内联p:http-request文档,因此该步骤不需要等待任何其他步骤先完成。因此,该步骤可以随时运行。

要解决此问题,您需要将c:request的输入端口连接到第二个p:http-request步骤。这可以显式地(使用p:xslt)或隐式地(依赖于XProc处理器将自动制造隐含的p:pipe连接的事实)。让我们在解决您的主要问题(在p:pipe中嵌入p:xslt的输出)同时演示:

为了在XML包装器中嵌入XML内容,通常的首选XProc步骤是c:bodyp:wrap。但是,它们使用简单的(一级)XML包装器元素,因此如果要包装多个XML级别(如在您的情况下:p:wrap-sequence),它们并不是那么有用。所以你必须使用别的东西 - 例如c:request/c:body步骤:

p:insert

让我们来看看它的作用:

  1. 我们为第二个... <p:xslt name="xslt2"> <p:input port="stylesheet"> <p:document href="XSLT-2.xslt"/> </p:input> </p:xslt> <p:insert match="c:request/c:body" position="first-child"> <p:input port="source"> <p:inline> <c:request href="http://localhost:80/myRESTserver/dburi/myDOC.xml" auth-method="basic" username="user" password="admin" method="put"> <c:body content-type="text/xml"> </c:body> </c:request> </p:inline> </p:input> <p:input port="insertion"> <p:pipe step="xslt2" port="result"/> </p:input> </p:insert> <p:http-request omit-xml-declaration="false" encoding="UTF-8"/> ... 步骤命名(p:xslt)。
  2. 我们在第二个xslt2步骤和p:identity步骤之间放置了p:xslt步骤。 p:http-request步骤使用静态p:identity文档作为插入目标,将名为c:request/c:body的步骤的输出用作要插入的内容。它将内容作为xslt2的第一个子项插入。
  3. 我们从c:request/c:body的{​​{1}}输入端口删除了静态连接。这很好,因为source步骤的输出会自动流入p:http-request p:insert输入端口。