2011-10-18 91 views
1

我在使用Saxon 9.3設置參數時遇到問題。我有基本的變換函數撒克遜XSLT傳遞參數

private void runXSLT(String inFile, String xslt, String outFile, String[] name, String[] val) 
{ 
    Processor proc = new Processor(); 
    XdmNode input = proc.NewDocumentBuilder().Build(new Uri(inFile)); 
    XsltTransformer transformer = proc.NewXsltCompiler().Compile(new Uri(xslt)).Load(); 
    transformer.InitialContextNode = input; 
    if (name != null) 
     for (int i = 0; i < name.Length; i++) 
     transformer.SetParameter(new QName("", "", name[i]), new XdmAtomicValue(val[i])); 
    Serializer serializer = new Serializer(); 
    FileStream outStream = new FileStream(outFile, FileMode.Create, FileAccess.Write); 
    serializer.SetOutputStream(outStream); 
    transformer.Run(serializer); 
    outStream.Close(); 
} 

其中字符串[]名稱和String [] VAL具有相等的長度與參數名稱和相應的值的陣列。例如:name [0]是「version」,val [0]是「1.0」,name [1]是「filename」,val [1]是「test.xml」

我基於這個函數關閉樣本代碼在文檔中給出,並且它對我的各種xslt轉換正確運行,除非我有參數傳遞給xslt。轉換將發生,如果參數未設置。

從調試中,我知道程序確實爲我的名字數組中的每個值運行SetParameter。我在每個xslt文檔中都有一個xsl:param,當使用命令行工具Transform.exe時,輸入參數並獲得正確的轉換。

我想如何傳遞參數有什麼問題嗎?

回答

2

如果它從命令行工作,我看不到任何明顯的原因,爲什麼它不應該與此代碼工作。一個區別是,命令行將params作爲untypedAtomic傳遞,而您將它們作爲字符串傳遞 - 如果版本需要數字,這可能會有所不同。

我建議在撒克遜幫助列表中進行跟蹤(在這裏您可以正確地跟蹤消息 - 當我們問這裏時,是否看到消息是純粹的機會),並提供一個可重現的小樣本,提供所有需要的信息 - 滿C#程序和一個簡單的樣式表。

+0

感謝您的回覆,並建議更小的幫助我測試我的功能。我創建了一個專門用於運行此功能的單獨程序,並找出它的工作原理,這意味着在向函數輸入參數時必須存在一些模糊的一致性錯誤。如果我有其他問題,我會跟進撒克遜人的幫助。 –