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



我的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调用转换时,它给我:

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

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

查看 https://learn.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的一种方法是使用doc2XPath.CreateNavigator().Select("/")作为AddParam方法的参数。

另请注意,您可以将 URL 传入 XSLT,然后只需使用 XSLTdocument函数即可加载文档。

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

最新更新