在我们的工作中,我们有一个自定义框架,可以帮助我们为客户服务构建快速而强大的页面。该框架的一个组件是一个特殊的“细节”功能,它允许您选择列表中的特定项目,单击它并查看其详细信息。这样做是因为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>
我们有两个问题:
我们无法在另一个xsl命令中执行value-of xsl
命令
我们不能在非根html组件中使用包含或导入功能,这意味着它不能在div,表格或行或任何内容中使用。
< / LI> 醇>非常感谢任何想法。
提前谢谢你:)
答案 0 :(得分:1)
xsl:include和xsl:import声明总是在编译时计算:在组装完所需的所有样式表模块之前,不能执行XSLT代码。
要创建样式表S的自定义版本,您应该将“自定义层”编写为添加或覆盖S中规则的模块M,然后您应该使M导入S.然后应该运行转换将M指定为样式表。
如果在决定如何构建样式表之前确实需要查看XML,那么您需要创建一个管道,其中第一步构造样式表,第二步执行它。您可以使用管道工具(如Xproc(或Orbeon或Cocoon或xmlsh甚至Ant ...)来执行此操作。