2015-12-17 94 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

相關問題