2015-12-17 71 views
0

主文件:<xsl:import> in <xsl:for-each>是否有可能或替代?

<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> 

我需要automaticaly根据现有文件的数量从目录&做这种事情,进口多个文件在foreach。

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

file1.xslt:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet id="my_awesome_id"> 
<xsl:import href="default-master"/> 
<xsl:output method="xml" version="1.0" encoding="utf-8" omit-xml-declaration="yes" media-type="text/xml" indent="yes"/> 
<xsl:template name="content"> 
    blablabla 
</xsl:template> 
<xsl:template name="templatename"> 
    I really need help for this one :/ 
</xsl:template> 
</xsl:stylesheet> 

树是这样的:

文件夹

| _ file1.xslt

| _ file2.xslt

| _ mainFile.sxlt

| _ file3.xslt

| _等..

而且我没有这个问题的解决方案的任何想法。

我想实现动态导入所有文件夹的xslt。如果以前不清楚,请提供。 我需要导入文件夹中的所有文件,而不必考虑文件数量或名称。 (我有一个容纳所有名的动态XML &的文件夹的XSLT文件路径)

+0

我有这样的感觉,你可能不知道究竟意味着什么。你真的要在你的转换中使用来自任何现有文件(关于哪个你什么都不知道 - 甚至不是它的名字)的指令(模板,函数等)吗?这似乎不大可能。所以,如果答案是否定的,那么您可能需要将所有这些处理为* data * - 而不是XSLT代码。在后一种情况下,你需要的不是,而只是功能集合() –

回答

2

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

+0

我不知道如何做到这一点。 我的意思是,可以自动计算xml中的文件列表? '看在W3C使用XSL:变换,但我不明白如何使用它在我的情况下... – Slater

+0

目前'mainFile.sxlt'文件(该文件扩展名可能是一个typeo,但类似可以用来指示它是你的模板)可以用作模板,并使用另一个样式表来生成'mainFile.xslt'和''元素。使用collection()遍历每个样式表该目录并生成导入元素。http://www.w3.org/TR/xpath-functions/#func-collection –

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:这里元素创建的XSLT命名空间的元素,这样做的另一种方法是使用XSL:命名空间别名)

这依赖于Saxon实现的collection()函数,它可以选择目录中的文件。与另一个处理器,你可能需要找到一个替代品。

+0

事实上,我试图解释说,我想实现一个动态输入我所有的xs lt文件。 我得到了一个Xml与所有路径,文件夹中的文件的名称,但我不能用它来导入文件夹的所有Xslt。 – Slater

+1

这不是您要满足的要求,而是您为满足要求而提出的设计。您没有告诉我们关于需求的任何信息,只关于您的设计,所以我们不能建议可能更好的替代设计。 –

+0

我同意这一点,这个设计不符合我的要求。但我不能告诉你这个系统。 – Slater

相关问题