如何使用Saxon将文档类型参数传递给XSLT?

3

发送原子数据类型时,将使用类似于以下方式:

transformer.SetParameter(new QName("", "", customXml), new XdmAtomicValue("true"));

如何从C#将XML/Node作为参数传递给XSLT?
能否帮助我?我按照您的代码操作,虽然它可以正常工作,但是我只得到了XML参数中的文本,而没有节点。
XSLT:
  <xsl:param name="look-up" as="document-node()"/>
  <xsl:template match="xpp:document">           
  <w:document xml:space="preserve"> 
        <xsl:value-of select="$look-up"/>
  </w:document>
  </xsl:template>

XML

  <?xml version="1.0" encoding="UTF-8"?>
  <document version="1.0" xmlns="http://www.sdl.com/xpp">
    //some tags 
</document>

传递参数(XML)
 <Job>
   </id>
 </Job>
1个回答

4
我认为你应该使用Processor对象来构建一个XdmNode,请查看文档,其中写道:

处理器提供了一个NewDocumentBuilder方法,顾名思义,返回一个DocumentBuilder。这可以用于从各种来源构建文档(具体而言,是XdmNode)。输入可以来自原始词汇XML,通过指定流或URI,也可以来自使用Microsoft XML解析器构建的DOM文档,通过指定XmlNode,或者可以通过指定XmlReader编程地提供。

然后,您可以将XdmNode传递给SetParameter方法http://saxonica.com/documentation/html/dotnetdoc/Saxon/Api/XsltTransformer.html#SetParameter%28Saxon.Api.QName,Saxon.Api.XdmValue%29,因为XdmValueXdmNode的基类(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));
        }

The XSLT is

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

并且

<root>
  <map>
    <key>foo</key>
    <value>bar</value>
  </map>
</root>

生成的输出结果为:
<root>
  <item>bar</item>
</root>

出现以下异常:系统ID:D:\Testservice\Install_Test\DOCX_XSLT\CustomXML.xsl 场景:CustomXML1 XML文件:C:\Users\velagasx\Desktop\divxml.xml XSL文件:D:\Testservice\Install_Test\DOCX_XSLT\xml2docx.xsl 引擎名称:Saxon-HE 9.4.0.6 严重程度:致命 描述:XPTY0019:'/'的第一个操作数需要是节点(node)类型;提供的值具有xs:untypedAtomic类型的项目类型 起始位置:11:0 URL:http://www.w3.org/TR/xpath20/#ERRXPTY0019 - it'sme
我正在传递参数 XdmNode input; //代码 transformer.SetParameter(new QName("", "", responsedetails), input),其中input是一个变量。 - it'sme
请编辑您的问题并提供详细信息,以便我们能够重现这个问题。我已经尝试了我的建议,使用Saxon 9.5,并且没有遇到任何问题,参数传递和识别都很正常。 - Martin Honnen
你好Martin Honnon, 感谢回复。 请查看上述编辑过的问题。请帮忙。 - it'sme
现在它可以工作了,更改为<xsl:copy-of select="$look-up"/>。 - it'sme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接