2011-07-12 24 views
0

我打算使用XQSharp獲得xslt2轉換,但在嘗試調用ApplyTemplates時遇到異常。XQSharp簡單的XSLT2轉換問題

我的代碼:

<WebMethod()> 
Public Function test(ByVal inputXml As String, ByVal inputXsl As String) As String 
     Dim nameTable As XmlNameTable = New NameTable() 

     Dim xmlReaderSettings As New XmlReaderSettings() 
     xmlReaderSettings.NameTable = nameTable 

     Dim document As XdmDocument 

     Using reader As New StringReader(inputXml) 
      document = New XdmDocument(reader) 
     End Using 

     Dim querySettings As New XsltSettings(nameTable) 
     querySettings.ContextItemType = XdmType.Node 
     querySettings.ModuleResolver = New XmlUrlResolver() 

     Dim query As Xslt = Xslt.Compile(New StringReader(inputXsl), 
querySettings) 

     Dim contextItem As XPathNavigator = document.CreateNavigator() 
     Dim result As Stream = New MemoryStream() 
     query.ApplyTemplates(contextItem, result) 


     Using reader As StreamReader = New StreamReader(result) 
      Return reader.ReadToEnd() 
     End Using 

End Function 

XmlInput:

<?xml version="1.0"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>hoi</title> 
</head> 
<body> 
    <p>Test</p> 
</body> 
</html> 

XslInput:

<?xml version="1.0"?> 
<xsl:stylesheet version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:xdt="http://www.w3.org/2005/02/xpath-datatypes" exclude-result-prefixes="xhtml xsl fn xs xdt"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/> 
</xsl:stylesheet> 

異常

System.ArgumentNullException是由用戶代碼
未處理 消息=值不能爲空。
參數名稱:格式
PARAMNAME =格式
源= mscorlib程序
堆棧跟蹤:
在System.String.Format(的IFormatProvider提供商,字符串格式,對象[]參數)
在XQSharp.XdmException.WrongParamNameTable(LineInfo lineInfo,XmlQualifiedName parameterName)以
在XQSharp.DocumentSet.ImportParamNode(LineInfo lineInfo,XPathNavigator的導航器,XmlQualifiedName parameterName)以
在XQSharp.DynamicContext.ConvertArgument(IEnumerable`1值,LineInfo lineInfo,documentSet documentSet,StaticModuleContext上下文,XmlQualifiedName名稱,BoundType declaredType)
在XQSharp.DynamicContext..ctor(StaticModuleContext staticContext,DynamicContextSettings設置,XmlQualifiedName的initialMode,XmlQualifiedName initialTemplate,的Int32 stackSpace,的Int32 globalSpace,IResultDocumentHandler resultDocumentHandler)
在XQSharp.Xslt.Evaluate(XmlQualifiedName的initialMode,XmlQualifiedName initialTemplate,DynamicContextSettings設置,IResultDocumentHandler resultDocumentHandler)
在XQSharp.Xslt.ApplyTemplates(IXPathNavigable contextNode,流resultDocument)
在Cmsservices.XSLTEngine.test(字符串inputXml,字符串inputXsl)在
d:\ Projecten \ cmsservices \ App_Code文件\ CmsservicesXSLTEngine.vb:線44 InnerException:

我做錯了什麼?

回答

1

引發了ArgumentNullException,因爲我們錯誤地引用了資源文件中的錯誤消息。這已在下一個版本(2.2)中得到修復。

問題是該文檔是使用與查詢不同的名稱表編譯的。

的問題出在你的源代碼下面幾行:

Using reader As New StringReader(inputXml) 
    document = New XdmDocument(reader) 
End Using 

你沒有指定名稱表用於構造的XdmDocument,因此爲文檔創建一個新的名稱表。

我打算建議您只需將名稱表傳遞給XdmDocument的構造函數,但剛剛注意到我們忽略了添加名稱表的構造函數。再次,這應該在下一個版本中得到改進。

要解決您的查詢,從一個XmlReader而不是構建您的XdmDocument:

Using reader As New StringReader(inputXml) 
    Using xmlReader As XmlReader = XmlReader.Create(reader, xmlReaderSettings) 
     document = New XdmDocument(xmlReader) 
    End Using 
End Using