下面我的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到数据库中)。
答案 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:body
和p:wrap
。但是,它们使用简单的(一级)XML包装器元素,因此如果要包装多个XML级别(如在您的情况下:p:wrap-sequence
),它们并不是那么有用。所以你必须使用别的东西 - 例如c:request/c:body
步骤:
p:insert
让我们来看看它的作用:
...
<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
)。xslt2
步骤和p:identity
步骤之间放置了p:xslt
步骤。 p:http-request
步骤使用静态p:identity
文档作为插入目标,将名为c:request/c:body
的步骤的输出用作要插入的内容。它将内容作为xslt2
的第一个子项插入。c:request/c:body
的{{1}}输入端口删除了静态连接。这很好,因为source
步骤的输出会自动流入p:http-request
p:insert
输入端口。