将 <p:xslt> 的输出馈送到 Xproc 中 HTTP PUT 请求的 <c:body>



我下面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-requestsource输入端口绑定到静态内联c:request文档,因此该步骤不需要等待任何其他步骤首先完成。因此,该步骤可以在任何时间运行。

要解决此问题,您需要将p:http-request的输入端口连接到第二个p:xslt步骤。这可以显式(使用p:pipe)或隐式(取决于XProc处理器将自动制造隐含的p:pipe连接这一事实)完成。让我们在解决过程中的主要问题(将p:xslt的输出嵌入到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:xslt步骤和p:http-request步骤之间放置了一个p:identity步骤。CCD_ 25步骤使用静态CCD_ 26文档作为插入目标,并使用名为CCD_ 27的步骤的输出作为要插入的内容。它将内容作为c:request/c:body的第一个子项插入
  3. 我们从p:http-requestsource输入端口移除了静态连接。这很好,因为p:insert步骤的输出将自动流入p:http-requestsource输入端口

相关内容

  • 没有找到相关文章

最新更新