如何使用 saxon 将文档类型参数传递给 xslt?

2024-06-06

对于发送原子数据类型将使用类似

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

如何将 XML/Node 作为参数从 C# 传递给 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>

我认为你应该使用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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 saxon 将文档类型参数传递给 xslt? 的相关文章

随机推荐