XsltTransform System.Xml.XPath.XPathException:“表达式必须计算为节点集。”

Posted

技术标签:

【中文标题】XsltTransform System.Xml.XPath.XPathException:“表达式必须计算为节点集。”【英文标题】:XsltTransform System.Xml.XPath.XPathException: 'Expression must evaluate to a node-set.' 【发布时间】:2020-04-29 03:36:03 【问题描述】:

我的 XSLT - 转换 有问题。这就是我创建 XSLT

的方式
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = CredentialCache.DefaultCredentials;

var xslt = new XslTransform();
xslt.Load(_xslPath, resolver);

using (StringReader sr = new StringReader(myXml))

    XPathDocument doc = new XPathDocument(sr);

    using (var sw = new StringWriter())
    
        var argList = new XsltArgumentList();
        var doc2 = File.ReadAllText("D:\\test\\Doc2.xml");
        using (StringReader sr2 = new StringReader(doc2))
        
            XPathDocument doc2XPath = new XPathDocument(sr2);

            argList.AddParam("doc2", "", doc2XPath);

            xslt.Transform(doc, argList, sw);
        
    

XSLT 我有这样的电话:

<xsl:call-template name="docBody">
    <xsl:with-param name="doc" select="$doc2/myDoc"/>
    <xsl:with-param name="docNr" select="$doc2Nr"/>
</xsl:call-template>

XSLT 调用 Transform 它给了我:

System.Xml.XPath.XPathException: '表达式必须计算为节点集。'

如何将另一个 XML 作为参数传递以使其仅使用 XslTransform 工作?

【问题讨论】:

你在&lt;xsl:with-param name="doc" select="$doc2/myDoc"/&gt;那一行得到错误吗?如果您改用argList.AddParam("doc2", "", doc2XPath.CreateNavigator());,它会起作用吗? docs.microsoft.com/en-us/dotnet/standard/data/xml/… 似乎暗示 XPathNavigator 可以工作。或者你甚至可能需要使用doc2XPath.CreateNavigator().Select("/") 来传递一个节点迭代器。我认为 XslCompiledTransform 更灵活一些。 【参考方案1】:

查看https://docs.microsoft.com/en-us/dotnet/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects?view=netframework-4.8#xslt-style-sheet-parameters,XslTransform 作为 XSLT/XPath 节点集看到的唯一 .NET 类型是 XPathNodeIterator,因此传递 XPathDocument 的一种方法是使用 @987654326 @ 作为AddParam 方法的参数。

还请注意,您可以将 URL 传递给 XSLT,然后简单地使用 XSLT document 函数来加载文档。

我认为 XslCompiledTransform 在直接传递 XPathDocuments 时更灵活一些 (https://docs.microsoft.com/en-us/dotnet/standard/data/xml/xslt-parameters?view=netframework-4.8)。

【讨论】:

以上是关于XsltTransform System.Xml.XPath.XPathException:“表达式必须计算为节点集。”的主要内容,如果未能解决你的问题,请参考以下文章

使用 System.Xml.XmlDocument 时是不是可以从 System.Xml.XmlNode 获取行号/位置?

System.Xml.dll 中出现“System.Xml.XmlException”类型的第一次机会异常

System.Xml 是不是使用 MSXML?

如何使用 System.Xml 创建此 xml 文件

如何使用 System.Xml.Linq 解析 xml 文件

Unity使用Mono.Xml代替System.Xml 测试