【问题标题】:Cocoon - Pipeline: Transform XML with XSL twice?Cocoon - 管道:用 XSL 转换 XML 两次?
【发布时间】:2009-08-16 20:25:40
【问题描述】:

我的问题是以某种方式设置 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>

【问题讨论】:

  • 根据以前的经验,我知道这是可能的,但如果我能记得那些年前我做了什么,我会被诅咒的......
  • 嗯...你能给我指出一个方向,我可以在哪里找到答案吗?

标签: xml xslt sitemap apache-cocoon


【解决方案1】:

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

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

我真的不知道您所说的“未找到标签”是什么意思,所以我的问题可能是错误的。

--

如果您想查看调试输出(即基于 xml 生成的确切内容,您应该使用视图 - 在站点地图中声明它(请参阅:http://cocoon.apache.org/2.0/userdocs/concepts/views.html)并为您的转换器添加标签。您可以然后通过调用 url?cocoon-view=YOURLABEL

来查看 xsl 使用了哪些数据

【讨论】:

  • 好的,我试试。我的问题的根源是,我不能使用例如xsl:value-of 在我的转换中。我认为这是因为 start.xml 仅包含对第一次转换所需的所有 xml 文件的引用,因此找不到“树标签”/properties/names,这意味着我得到一个空结果。
  • 通常当 xsl 不产生任何输出时,因为它无法解析。检查 cocoon-core.log 并将 xsl 减少到一个非常小的(只是
  • 我通常发现使用 JX 模板比处理 map:aggregate 更容易。它更加灵活。
【解决方案2】:

Michael 似乎不再是用户了,但无论如何我都会回答这个问题。基本上是添加代码来说明 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 永远不会改变,那么如上所述,&lt;map:aggregate&gt; 会更高效。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 2016-02-12
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多