1

「*.myxml」のパターンに一致する Cocoon でパイプラインを作成しようとしています。これは、(generate type="file" を使用して) XML ファイルを読み取ります。この XML ファイルは次のように形成されます (多数のファイルがあります)。

<result>
   <file>
       <name>a.myxml</name>
       <source>b.xml</source>
       <transform>c.xslt</transform>
   </file>
   ...
</result>

したがって、パターンが a.myxml の場合、b.xml を読み取り、c.xslt を適用します。これらすべては、この XML ファイルを使用して動的に行われます。毎回パイプラインを変更することなく、新しいファイル (独自の .xml および .xslt を含む) を追加できるようにしたいと考えています。

出来ますか?これのためのセレクターはありますか?XML ファイルのコンテンツ (XPath セレクター ファイル [/name = {1}.myxml]/source など) を生成および変換の src として渡す方法はありますか?

ご協力ありがとうございました。

4

1 に答える 1

0

Cocoon では通常より少し複雑ですが、あなたが求めていると思われるサンプルを作成しました。

サイトマップ:

<map:pipeline>
  <map:match pattern="*.myxml">
    <map:generate src="my.xml"/>
    <map:transform src="sf-myxml.xslt">
      <map:parameter name="myxml" value="{1}.myxml"/>
    </map:transform>
    <map:transform type="include"/>
    <map:serialize type="xml"/>
  </map:match>

  <map:match pattern="myxml/**">
    <map:generate src="{1}"/>
    <map:transform src="{request-param:stylesheet}"/>
    <map:serialize type="xml"/>
  </map:match>
</map:pipeline>

したがって、一致する *.myxml は、動的構成ファイルから XML を生成します。

<result>
  <file>
    <name>a.myxml</name>
    <source>b.xml</source>
    <transform>c.xslt</transform>
  </file>

  <file>
    <name>x.myxml</name>
    <source>y.xml</source>
    <transform>c.xslt</transform>
  </file>

</result>

sf-myxml.xslt を使用すると、これは Cinclude 呼び出しに変換されます。

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
   xmlns:ci="http://apache.org/cocoon/include/1.0"
   exclude-result-prefixes="xs xd"
   version="2.0">


  <xsl:param name="myxml"/>

  <xsl:template match="/result">
    <xsl:copy>
        <xsl:apply-templates select="file[name eq $myxml]"/>
    </xsl:copy>
  </xsl:template>


  <xsl:template match="file">
    <ci:include src="cocoon:/myxml/{source}?stylesheet={transform}"/>
  </xsl:template>


</xsl:stylesheet>

適切な <file> 要素を見つけて、<source> 要素と <transform> 要素を使用します。たとえば、呼び出し "/a.myxml" の場合、次のように生成されます。

 <ci:include src="cocoon:/myxml/b.xml?stylesheet=c.xslt"/>

<cinclude> 内のこの cocoon:/ 呼び出しは、次の <map:match> によって照合されます。上記の例では、b.xml が c.xslt によって変換されます。私はそれを試してみましたが、うまくいきます。

ここに b.xml があります:

<page/>

y.xml は次のとおりです。

<page title="z.myxml"/>

c.xslt は次のとおりです。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
  exclude-result-prefixes="xs xd"
  version="2.0">

  <xsl:template match="page">
    <html><head><title><xsl:value-of select="@title"/></title></head><body><h1><xsl:value-of select="@title"/></h1></body></html>
  </xsl:template>

</xsl:stylesheet>

a.myxl を呼び出すとタイトルが表示されず、z.myxml を呼び出すと「z.myxml」というタイトルが表示されます。これがあなたが探していたものであることを願っています。

よろしく、

Huib Verweij。

于 2014-02-17T13:40:54.190 に答える