2012-09-26 40 views
0

我有一點問題。我必須使用XSLT從XML文件生成HTML文件。但是HTML文件名是由XML內容生成的。 在我來說,我解決我的問題如下:XSLT 2.0從xml生成輸出文件名

public File GenerateHTML(File fileIn) { 
    File xsltFile = new File(xsltfileString); 
    File htmlFile = new File(System.getProperty("user.home") + File.separator + "result.html"); 
    File htmlFileFinal = null; 
    Source xmlSource = new StreamSource(fileIn); 
    Source xsltSource = new StreamSource(xsltFile); 
    Result htmlResult = new StreamResult(htmlFile); 
    TransformerFactory transFact = TransformerFactory.newInstance(); 
    Transformer trans; 
    try { 
     trans = transFact.newTransformer(xsltSource); 
     trans.setParameter("filter_xml", filterXML); 
     trans.setParameter("FileName", fileIn.getName()); 
     trans.transform(xmlSource, htmlResult); 
     String outputFileName = (String)trans.getParameter("OutputFilename"); 
     htmlFileFinal = new File(System.getProperty("user.home") + File.separator + outputFileName + ".html"); 
     htmlFile.renameTo(htmlFileFinal); 
    } catch (TransformerConfigurationException ex) { 
     LOGGER.log(Level.FATAL, ex.getMessage(), ex); 
    } catch (TransformerException ex) { 
     LOGGER.log(Level.FATAL, ex.getMessage(), ex); 
    } 
    return htmlFileFinal; 
} 

,並在我的XSLT我做的:

<!-- general settings --> 
<xsl:output method="html" omit-xml-declaration="yes" indent="yes" encoding="UTF-8" /> 

<xsl:variable name="filter" select="document($filter_xml)/Filtre/Bloc5" /> 

<!-- transformation body --> 
<xsl:template match="*"> 
    <xsl:param name="OutputFilename" select="concat(cac:ContractDocumentReference/cbc:ID, '_', cbc:ID, '_', translate(cbc:IssueDate, '-', ''))" /> 
[...] 

此解決方案,但我問自己,如果它被優化或有在XSLT中生成一個動態輸出文件名是一個竅門嗎?

回答

3

對於XSLT 2.0,您當然可以創建帶名稱的結果文檔,並分別基於XML輸入值創建URL(例如,

<xsl:template match="/"> 
    <xsl:result-document href="{root/foo/bar}.xml"> 
    <xsl:apply-templates/> 
    </xsl:result-document> 
</xsl:template> 

您也可以從命名模板開始,例如

<xsl:template name="main"> 
    <xsl:variable name="doc1" select="doc('input.xml')"/> 
    <xsl:result-document href="{$doc1/root/foo/bar}.xml"> 
    <xsl:apply-templates select="$doc1/node()"/> 
    </xsl:result-document> 
</xsl:template> 

雖然我不確定如何適合您使用的JAXP轉換API。

+0

我問myslef是否有一個技巧,可以輕鬆地將XML文檔轉換爲HTML文檔,其中XML文件名已從XML內容生成。 –

+0

這不是一招:馬丁向你展示瞭如何去做。你的代碼在做什麼我無法開始理解。 trans.getParameter()不應該以你使用它的方式返回任何東西。 –

+0

@ginogure,我的代碼示例創建了一個結果文檔,其中名稱是根據對XPath表達式「root/foo/bar」的計算結果構建爲帶有這些元素和字符串「.xml」的虛構輸入文檔的結果文檔。因此,修改該路徑表達式以適合您的輸入文檔,並且您有正確的方法。或者發佈你的輸入樣本,並告訴我們它應該定義文件名的哪一部分。 –

0

你也可以完全避免for-each。 ...從工作xslt。

<xsl:template match="EXTRACT-DATASETS/SUBSET"> 
... 
... 
<xsl:result-document href="{$filename-stub}.ctl"> 
... 
... 
</xsl:result-document> 
</xsl:template> 

這將爲它找到的每個匹配項生成一個文件。變量文件名存根在主模板內計算。沒有爲每個需要....