1

我正在尝试在 Cocoon 中编写一个与“*.myxml”模式匹配的管道,然后读取(使用 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”。希望这就是你要找的。

问候,

惠布·维韦杰。

于 2014-02-17T13:40:54.190 回答