在另一个内部动态导入XSLT

时间:2011-04-28 17:14:57

标签: xml xslt dynamic import include

在我们的工作中,我们有一个自定义框架,可以帮助我们为客户服务构建快速而强大的页面。该框架的一个组件是一个特殊的“细节”功能,它允许您选择列表中的特定项目,单击它并查看其详细信息。这样做是因为Detail组件接收预定义的XML结构并使用XSLT对其进行解析,这使得它可以在不同的数据选项卡中显示数据,显示图像或汇总特定数据以及其他功能。

我们的要求是我们希望能够添加预定义XML结构之外的新选项卡,例如,我们可以添加自定义图表或任何其他特定数据显示。

为此,我们认为可能的解决方案是在预定义的XML结构中创建特殊选项卡,并使用两个新属性:

  • 类型:告诉父XSLT不应使用标准XSL转换解析此选项卡。 (例如:“Literal”)

  • transformationSource:告诉父XSLT它应该包含/导入哪个新的XSLT来转换这个特定的选项卡。 (例如: “newTransformation.xslt”)

这可以动态做吗?这方面的事情:

<div>
  <xsl:for-each select="Tab"> 
    <xsl:choose>
      <xsl:when test="@type='Literal'">
        <xsl:include href=<xsl:value-of select='@transformationSource'/> 
      </xsl:when>
      <xsl:otherwise> --do what it does everytime
        <xsl:apply-templates select="Header" />
        <xsl:apply-templates select="Data" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each>
</div>

我们有两个问题:

  1. 我们无法在另一个xsl命令中执行value-of xsl命令

  2. 我们不能在非根html组件中使用包含或导入功能,这意味着它不能在div,表格或行或任何​​内容中使用。

    < / LI>

    非常感谢任何想法。

    提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

xsl:include和xsl:import声明总是在编译时计算:在组装完所需的所有样式表模块之前,不能执行XSLT代码。

要创建样式表S的自定义版本,您应该将“自定义层”编写为添加或覆盖S中规则的模块M,然后您应该使M导入S.然后应该运行转换将M指定为样式表。

如果在决定如何构建样式表之前确实需要查看XML,那么您需要创建一个管道,其中第一步构造样式表,第二步执行它。您可以使用管道工具(如Xproc(或Orbeon或Cocoon或xmlsh甚至Ant ...)来执行此操作。