2011-07-12 19 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は、ユーザーコード
によって未処理でした メッセージ=値をnullにすることはできません。
パラメータ名:形式
paramNameに=フォーマット
ソース= mscorlib
のStackTrace:System.String.Formatで
XQSharp.XdmException.WrongParamNameTable(LineInfoで
(するIFormatProviderプロバイダー、文字列の形式は、[]引数オブジェクト) XQSharp.DynamicContext.ConvertArgument(IEnumerable`1値、lineInfo lineInfo、documentSet documentSet、StaticModuleContextコンテキスト、XmlQualifiedName名、BoundTypeでlineInfo、XmlQualifiedName ParameterNameが)XQSharp.DocumentSet.ImportParamNode(lineInfo lineInfo、のXPathNavigatorナビゲータ、XmlQualifiedName ParameterNameが)で

declaredType)XQSharp.Xslt.Evaluate(XmlQualifiedName initialMode、XmlQualifiedName initialTemplate、DynamicContextSettings設定、IResultDocumentHandlerでXQSharp.DynamicContext..ctor(StaticModuleContext staticContext、DynamicContextSettings設定、XmlQualifiedName initialMode、XmlQualifiedName initialTemplate、のInt32 stackSpace、のInt32 globalSpace、IResultDocumentHandler resultDocumentHandler)で
resultDocumentHandler)XQSharp.Xslt.ApplyTemplates(IXPathNavigable contextNode、ストリームresultDocument)

DにおけるCmsservices.XSLTEngine.test(文字列inputXml、列inputXsl)で で
:\ Projecten \ cmsservices \にApp_Code \ CmsservicesXSLTEngine.vb:ライン44 内部エラー:

私は間違っていますか?

答えて

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