我想要使用XQSharp进行xslt2转换,但在尝试调用ApplyTemplates时出现异常。
我的代码:
<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提供程序,String格式,Object [] args)
在XQSharp.XdmException.WrongParamNameTable(LineInfo lineInfo,XmlQualifiedName parameterName)
在XQSharp.DocumentSet.ImportParamNode(LineInfo lineInfo,XPathNavigator navigator,XmlQualifiedName parameterName)
at XQSharp.DynamicContext.ConvertArgument(IEnumerable`1 value,LineInfo lineInfo,DocumentSet documentSet,StaticModuleContext context,XmlQualifiedName name,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,Stream resultDocument)
at Cmsservices.XSLTEngine.test(String inputXml,String inputXsl)in D D:\ Projecten \ cmsservices \ App_Code \ CmsservicesXSLTEngine.vb:第44行
InnerException:
我做错了什么?
答案 0 :(得分: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