<xsl:for-each>中的<xsl:import>是可能还是替代?

时间:2015-12-17 13:04:24

标签: xml xslt xslt-1.0 xslt-2.0

主档案:

.element img{width:100%}

我需要做这种事情,从目录中导入foreach中的多个文件&amp;自动取决于现有文件的数量。

所有现有文件都是这样的:

file1.xslt:

<xsl:stylesheet id="myid"
 <xsl:for-each select=".">
  <xsl:import href="{concat(@attr1,@attr2)}"/>
 </xsl:for-each>
 <xsl:template name="content">
  bla bla bla
  <xsl:call-template name="templatename">
  </xsl:call-template>
 </xsl:template>
</stylesheet>

树就像:

文件夹

| _ file1.xslt

| _ file2.xslt

| _ mainFile.sxlt

| _ file3.xslt

| _等......

我不知道解决这个问题的方法。

我想实现动态导入文件夹的所有xslt。 Srry如果以前不清楚的话。 我需要导入文件夹中的所有文件,而无需关心文件数量或名称。 (我有一个动态Xml,其中包含文件夹的xslt文件的所有名称和路径)

2 个答案:

答案 0 :(得分:2)

您需要将所有xsl:importxsl:include作为样式表的xsl:stylesheet/xsl:transform根元素的子元素。而且您无法计算href值。如果您想以编程方式构造XSLT,那么您当然可以编写一个XSLT来创建另一个XSLT作为输​​出,但是生成的XSLT的执行则是一个单独的步骤。

答案 1 :(得分:1)

您无法执行您要执行的操作 - 在执行样式表的同时构建样式表。那又有什么选择呢?很难知道,因为你没有告诉我们你想要实现的目标,你只会向我们展示一个不实现它的尝试。但是如果你真的需要构建一个包含恰好位于目录树特定分支中的所有模块的样式表,那么你可以通过两阶段过程来完成:首先构建样式表,然后运行它。要构建样式表,您可以执行以下操作:

<xsl:transform....>
  <xsl:variable name="xn" select="'http://www.w3.org/1999/XSL/Transform'"/>
  <xsl:template name="main">
    <xsl:element name="stylesheet" namespace="{$xn}"/>
      <xsl:for-each select="collection('.?select=*.xslt')">
        <xsl:element name="import" namespace="{$xn}"/>
      </xsl:for-each....

(我在这里使用了xsl:element来创建XSLT名称空间中的元素;另一种方法是使用xsl:namespace-alias)

这依赖于Saxon对collection()函数的实现,该函数能够选择目录中的文件。使用其他处理器,您可能需要找到替代方案。