我下面Xproc管道的目标是接收一个源XML文档,用<p:xslt>
步骤运行两个XSLT转换,然后在第二个<p:xslt>
之后将输出XML馈送到<p:http-request>
步骤的<c:body>
:
<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>
有办法做到这一点吗?当我尝试按原样执行此代码时,首先调用<p:http-request>
(将一个空的XML文件PUTS到数据库中)。
p:http-request
之所以首先运行,是因为它不依赖于管道中的任何其他步骤。p:http-request
的source
输入端口绑定到静态内联c:request
文档,因此该步骤不需要等待任何其他步骤首先完成。因此,该步骤可以在任何时间运行。
要解决此问题,您需要将p:http-request
的输入端口连接到第二个p:xslt
步骤。这可以显式(使用p:pipe
)或隐式(取决于XProc处理器将自动制造隐含的p:pipe
连接这一事实)完成。让我们在解决过程中的主要问题(将p:xslt
的输出嵌入到c:body
中)时演示两者:
要在XML包装器中嵌入XML内容,通常的XProc步骤是p:wrap
和p:wrap-sequence
。但是,它们使用简单的(一级)XML包装器元素,因此如果您想包装在多个级别的XML中(如您的案例: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:xslt
步骤和p:http-request
步骤之间放置了一个p:identity
步骤。CCD_ 25步骤使用静态CCD_ 26文档作为插入目标,并使用名为CCD_ 27的步骤的输出作为要插入的内容。它将内容作为c:request/c:body
的第一个子项插入 - 我们从
p:http-request
的source
输入端口移除了静态连接。这很好,因为p:insert
步骤的输出将自动流入p:http-request
的source
输入端口