Cocoon - Pipeline:用XSL转换XML两次?

时间:2009-08-16 20:25:41

标签: xml xslt sitemap apache-cocoon

我的问题是以某种方式设置Cocoon sitemap.xmap,它首先使用XSL转换XML文件,然后我可以将其用于我自己的转换。

我有以下文件:

start.xml:包含应用combine_start.xsl

组合在一起的文件的引用

transform.xsl:这是我自己的XSL文件,我希望在使用combine_start.xsl(输出XML)进行转换时使用

由于start.xml是进程中所需的所有文件的索引,因此如果应用了任何XSL函数(未找到任何标记),则以下站点地图将不会显示任何结果。 我在网上搜索,但在应用另一个转换之前,我还没有找到一种方法来设置一个首先进行转换的管道。

希望我的问题太令人困惑,我感谢任何帮助。下面你会找到我试过的站点地图。

<?xml version="1.0"?>
<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">

 <map:pipelines>

  <map:pipeline>

   <map:match pattern="*">
     <map:generate src="start.xml"/>
     <map:transform src="transform.xsl">
             <map:parameter name="X" value="{request-param:X}"/>
             <map:parameter name="Semester" value="{request-param:Semester}"/>
             <map:parameter name="Name" value="{request-param:Name}"/>
             <map:parameter name="XXX" value="{request-param:XXX}"/>
     </map:transform>
     <map:serialize/>
   </map:match>

  </map:pipeline>
 </map:pipelines>
</map:sitemap>

2 个答案:

答案 0 :(得分:1)

您可以多次变换。只需调用map:再次转换(使用不同的xsl) - 在序列化之前。

你也可以使用map:part / map:aggregate将多个匹配器混合在一起然后应用一个map:转换它们(或i:include变换器)。

我真的不知道你的意思是“找不到标签”,所以也许我正在解决这个问题。

-

如果你想看到调试输出(即,根据xml确切生成了什么,你应该使用视图 - 在站点地图中声明它(参见:http://cocoon.apache.org/2.0/userdocs/concepts/views.html)并为变换器添加标签。然后你可以通过调用url来确切地看到xsl正在使用什么数据?cocoon-view = YOURLABEL

答案 1 :(得分:1)

迈克尔似乎不再是一个用户,但无论如何我都会回答这个问题。基本上添加代码来说明Niko的答案,并且更具体一些。

将transform.xsl应用于combine_start.xsl [ObHalfLife2Reference]的输出的方法是:

   <map:match pattern="*">
     <map:generate src="start.xml"/>
     <map:transform src="combine_start.xsl" />
     <map:transform src="transform.xsl">
             <map:parameter name="X" value="{request-param:X}"/>
             <map:parameter name="Semester" value="{request-param:Semester}"/>
             <map:parameter name="Name" value="{request-param:Name}"/>
             <map:parameter name="XXX" value="{request-param:XXX}"/>
     </map:transform>
     <map:serialize/>
   </map:match>

如果我理解你是说combine_start.xsl的输出是空的,那么这不是Cocoon问题而是XSLT问题......你的combine_start.xsl无法正常工作。

鉴于start.xml是要提供给transform.xsl的文件的索引,cinclude transformer可能就是您要查找的内容,而不是实现样式表来填充它们。另一方面,如果start.xml的内容永远不会改变,然后如上所述,<map:aggregate>会更有效率。