XPROC - Генерация файлов во вторичном порту - PullRequest
0 голосов
/ 20 ноября 2011

Мое требование - сгенерировать один файл 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> в приведенном выше фрагменте кода.

Как у вас две <p:store> ступени?(Один для HTML, а другой для XML)

1 Ответ

1 голос
/ 24 ноября 2011

Было бы неплохо, если бы вы могли каким-то образом определить, с какими параметрами 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.Вы можете использовать XPath, если, при условии, что ваш анализатор XProc поддерживает XPath 2.0 (как XMLCalabash).Но я бы порекомендовал использовать 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, если хотите.

Также требуется, чтобы вы использовали .xhtml в качестве расширения в ваших xsl:result-document выражениях для вывода HTML, но вы можете легко настроить его, если хотите.

var и choose должно быть достаточно для правильной записи XML, по крайней мере.

Удачи!

...