1

次の構造のxmlドキュメントを取得しました

<listOfNodes>
    <node name="file1">content1</node>
    <node name="file2">content2</node>
    ...
    <node name="fileN">contentN</node>
</listOfNodes>

結果を含む xproc パイプラインを作成したい:

  • file1.txt と content1
  • file2.txt と content2
  • ...
  • fileN.txt と contentN

私の最初のアプローチは次のとおりです。

<p:declare-step name="step_1" type="ts:Extract">
        <p:input port="source" />
        <p:filter select="nodes" name="step_1.1" />
         <p:for-each name="step_1.2">
            <p:iteration-source><p:pipe port="result" step="step_1.1"/></p:iteration-source>
            <p:store method="text" >
                 <p:with-option name="href" select="concat('file:/', 'step_1_',iteration-position(),'.txt')"/>
            </p:store>
        </p:for-each>
</p:declare-step>

しかし、これで DX0006 エラーが発生します。

誰か助けてくれませんか?

4

3 に答える 3

2

content1、...、contentN が整形式の XML である場合、次のパイプラインでうまくいきます。

<p:declare-step version="1.0" xmlns:p="http://www.w3.org/ns/xproc">
  <p:input port="source"/>
  <p:for-each>
    <p:iteration-source select="/*/node"/>
    <p:variable name="filename" select="concat(/node/@name, '.txt')"/>
    <p:unwrap match="/*"/>
    <p:store>
      <p:with-option name="href" select="$filename"/>
    </p:store>
  </p:for-each>
</p:declare-step>

content1、...、contentN がワームされた XML でない場合 (プレーン テキスト、複数の兄弟要素など)、適用する前にそれらを XML ラッパー要素でラップできますp:store(または単にステップを適用しないでくださいp:unwrap)。ラッパー要素を使用したくない場合、標準p:storeは機能しません (一部の XProc 実装p:storeでは、ドキュメント要素のコンテンツのみを格納するために拡張属性をサポートする場合がありますが、それは別の話です)。1 つの可能性は、p:xslt代わりに使用することです。

于 2014-03-19T16:24:35.417 に答える
0

コードがエラーをスローする理由を理解するために、自分で試してみました。しかし、エラーを再現できませんでした。これは XMLCalabash で問題なく実行されました。

<p:declare-step name="step_1" type="ts:Extract" version="1.0" xmlns:p="http://www.w3.org/ns/xproc" xmlns:ts="ts">
    <p:input port="source" />
    <p:filter select="/*/node" name="step_1.1" />
     <p:for-each name="step_1.2">
        <p:iteration-source><p:pipe port="result" step="step_1.1"/></p:iteration-source>
        <p:store method="text" >
             <p:with-option name="href" select="concat('step_1_', p:iteration-position(), '.txt')"/>
        </p:store>
    </p:for-each>
</p:declare-step>

p および ts 名前空間宣言を追加する必要があり、interation-position() の前に p: も追加したことに注意してください。ファイルがファイル システムのルートに書き込まれるという実際的な理由から、「file:/」を削除しました。

DX0006 エラーの記録は見つかりませんでした。おそらく、あなたのマシンのルートにもファイルを書き込もうとしたのですが、許可されていませんでしたか?

チッ!

于 2014-03-27T21:18:21.547 に答える