1

我在下面的 Xproc 管道的目标是接收一个源 XML 文档,运行 2 个带有<p:xslt>步骤的 XSLT 转换,然后将第 2 个步骤之后的输出 XML 提供给第 2<p:xslt><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>

有没有办法做到这一点?当我尝试按原样执行此代码时,<p:http-request>首先调用 (将一个空的 XML 文件放入数据库)。

4

1 回答 1

4

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

要解决这个问题,您需要将输入端口连接p:http-requestp:xslt第二步。这可以显式地(使用p:pipe)或隐式地完成(依赖于 XProc 处理器将自动生成隐含连接的事实p:pipe)。让我们在解决您的主要问题(嵌入p:xsltin的输出c:body)的同时演示这两个过程:

为了在 XML 包装器中嵌入 XML 内容,通常的 XProc 步骤是p:wrapp: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"/>
...

让我们看看这是做什么的:

  1. 我们给p:xslt第二步起了一个名字(xslt2)。
  2. 我们在第二步和p:identity第二步之间放置了一个步骤。该步骤使用静态文档作为插入目标,将步骤的输出命名为要插入的内容。它将内容作为 的第一个子项插入。p:xsltp:http-requestp:identityc:request/c:bodyxslt2c:request/c:body
  3. source我们从p:http-request. 这很好,因为p:insert步骤的输出将自动流入source输入端口p:http-request
于 2015-04-01T13:49:16.757 回答