XQSharp简单的XSLT2转换问题

时间:2011-07-12 08:09:22

标签: .net vb.net xslt

我想要使用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:

我做错了什么?

1 个答案:

答案 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