0

私の要件は、セカンダリ ポートで 1 つの XML ファイルといくつかの HTML ファイルを生成することです。XProc でいくつかのステップを構成しました。

サンプルコードは次のとおりです。

<p:xslt name="create-document">
    <p:input port="stylesheet">
      <p:document href="stylesheet.xsl" />
    </p:input>  
  </p:xslt>  
  <p:for-each>
    <p:iteration-source>
      <p:pipe step="create-document" port="secondary" />
    </p:iteration-source>
   <p:store>
    <p:with-option name="doctype-public" select="'-//W3C//DTD XHTML 1.0 Frameset//EN'" />
    <p:with-option name="doctype-system" select="'http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd'" />
    <p:with-option name="encoding" select="'UTF-8'" />
    <p:with-option name="media-type" select="'text/html'" />
    <p:with-option name="method" select="'xhtml'" />
    <p:with-option name="omit-xml-declaration" select="'no'" />
  </p:store>
  </p:for-each>

ここでの問題は、HTML ファイルが正しく生成されることです。XML ファイルが生成されますが、XML コンテンツを表示できません。代わりに、すべてを HTML 形式で表示します。これは<p:store>、上記のコード スニペットが原因です。

どのように2つの<p:store>ステップがありますか?(1 つは HTML 用、もう 1 つは XML 用)

4

1 に答える 1

1

xsl:result-document二次出力の各ドキュメントがどのパラメータで書き込まれたかをどうにかして判断できれば幸いです。あなたはあなたのためにそれらを複製することができますp:store. しかし、各文書から他のものを導き出すことができます。を使用してドキュメント名を取得できbase-uri()、たとえばルート要素を確認できます。以下を使用して、これらの値を変数に入れることができます。

<p:variable name="path" select="base-uri(/*)"/>
<p:variable name="root" select="local-name(/*)"/>

(これらを のすぐ下に置きますp:iteration-source。)

次に、 を呼び出す方法を決定する必要がありますp:store。XProc パーサーが XPath 2.0 をサポートしている場合 (XMLCalabash のように)、XPath を使用できます。ただし、次のp:chooseようなものを使用することをお勧めします。

<p:choose>
    <p:when test="ends-with($path, '.xhtml')">
        <p:store
            doctype-public="-//W3C//DTD XHTML 1.0 Frameset//EN"
            doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"
            encoding="UTF-8"
            media-type="text/html"
            method="xhtml"
            omit-xml-declaration="no">
            <p:with-option name="href" select="$path"/>
        </p:store>
    </p:when>
    <p:otherwise>
        <p:store
            encoding="UTF-8"
            media-type="application/xml"
            method="xml"
            omit-xml-declaration="no">
            <p:with-option name="href" select="$path"/>
        </p:store>
    </p:otherwise>
</p:choose>

(この全体は、既に持っているものをp:choose置き換えます。)p:store

のテストはp:whenのみを参照しますが、必要に応じ$pathて のテストも含めることができます$root

また、HTML 出力のステートメントで.xhtml拡張として使用する必要がありますが、必要xsl:result-documentに応じて簡単に調整できます。

少なくとも XML を適切に記述するには、 と で十分varです。choose

幸運を!

于 2011-11-24T15:12:48.323 に答える