我认为你应该使用Processor
对象构造一个XdmNode
,请参阅文档,内容如下:
Processor 提供了一个方法 NewDocumentBuilder,其名称为
意味着,返回一个 DocumentBuilder。这可以用来构造一个
来自各种来源的文档(特别是 XdmNode)。这
输入可以通过指定 Stream 或 Uri 来自原始词汇 XML,
或者它可能来自使用 Microsoft XML 构建的 DOM 文档
通过指定 XmlNode 来解析器,或者可以提供它
通过编程指定 XmlReader。
然后你可以传入XdmNode
to the SetParameter
method http://saxonica.com/documentation/html/dotnetdoc/Saxon/Api/XsltTransformer.html#SetParameter%28Saxon.Api.QName,Saxon.Api.XdmValue%29 http://saxonica.com/documentation/html/dotnetdoc/Saxon/Api/XsltTransformer.html#SetParameter%28Saxon.Api.QName,Saxon.Api.XdmValue%29 as XdmValue
是一个基类XdmNode
(XmlValue -> XdmItem -> XdmNode)。
下面是一个适用于我的 .NET 上的 Saxon 9.5 HE 的示例:
Processor proc = new Processor();
DocumentBuilder db = proc.NewDocumentBuilder();
XsltTransformer trans;
using (XmlReader xr = XmlReader.Create("../../XSLTFile1.xslt"))
{
trans = proc.NewXsltCompiler().Compile(xr).Load();
}
XdmNode input, lookup;
using (XmlReader xr = XmlReader.Create("../../XMLFile1.xml"))
{
input = db.Build(xr);
}
using (XmlReader xr = XmlReader.Create("../../XMLFile2.xml"))
{
lookup = db.Build(xr);
}
trans.InitialContextNode = input;
trans.SetParameter(new QName("lookup-doc"), lookup);
using (XmlWriter xw = XmlWriter.Create(Console.Out))
{
trans.Run(new TextWriterDestination(xw));
}
XSLT 是
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:param name="lookup-doc"/>
<xsl:key name="map" match="map" use="key"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="item">
<xsl:copy>
<xsl:value-of select="key('map', ., $lookup-doc)/value"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
XML 文档是
<root>
<item>foo</item>
</root>
and
<root>
<map>
<key>foo</key>
<value>bar</value>
</map>
</root>
结果输出是
<root>
<item>bar</item>
</root>