2011-04-18 90 views
0

創建一個子目錄我有一個非常簡單的模板匹配在我的XSLT代碼創建一個ditamap,它的工作原理是剛創建時相匹配的原始文檔的「科」一化的topicref。方式來避免的topicref

初始XML代碼片段看起來像:

<Section Target="IL27TRM409TueAug251754042009251"> 
<Heading Target="v5170372">WBG (S-GW/P-GW) chassis </Heading> 

爲部分中的XSLT模板匹配看起來像:

<xsl:template match="Section> 
<xsl:variable name="file" select="Heading"/> 
<xsl:variable name="fileName" select="translate(normalize-space($file),' ','_')"/> 
    <topicref format="dita" href="{translate(./$fileName,' ','_')}.xml" navtitle="{./Heading}"> 
    <xsl:apply-templates/> 
    </topicref> 

代碼工作,除了對於像上述的「WBG的標題(S -GW/P-GW)底盤」,它將使用 「/」 作爲一個子文件夾,所以它會創建一個名爲subforlder 「WBG(S-GW」,則創建一個文件 「P-GW)_chassis.xml」 。

有沒有一種方法,使XSLT忽略「/」標題中,只是把它當作一個字符串創建只需使用該字符串的XML文件?

+2

XSLT不會創建subforlders,它只是採取任何數量的XML樹作爲輸入和輸出一個(或多個在XSLT 2.0),XML樹作爲輸出。它可能或可能不負責序列化。在這裏,你的輸出的消費者明白你的'@ href'指的是一個子文件夾。 **爲什麼不只是替換'/'字符爲其他有效的URI?** – 2011-04-18 16:10:49

回答

1

羅伯特,只是爲了擴大對@亞歷杭德羅的正確答案/評論:

這並不是說是創造一個文件夾XSLT。 XSLT已經在標題中「忽略」/:它不會將其視爲任何特殊的東西。 (看看XSLT的輸出,你可以看到這一點。)

什麼操作系統(或者更恰當,文件系統)是您創建的文件?根據這一點,'/'可能是文件名中的非法字符,所以用其他字符代替它可能是您唯一的選擇。嘗試手動命名文件a/b並查看是否有可能。由於您使用normalize-space()已經,看來你是不是絕對需要在文件名保存精確的標題內容。

要爲/替代-,修改translate()表達這樣的:

translate(normalize-space($file),' /','_-') 

這意味着 「替代_每一個空間,並替換-爲每/」。