【问题标题】:How to pass document type parameter to xslt using saxon?如何使用 saxon 将文档类型参数传递给 xslt?
【发布时间】:2014-06-06 08:17:03
【问题描述】:

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

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>

【问题讨论】:

    标签: c# xslt-2.0 saxon


    【解决方案1】:

    我认为您应该使用Processor 对象来构造XdmNode,请参阅文档:

    Processor 提供了一个 NewDocumentBuilder 方法,其名称为 暗示,返回一个 DocumentBuilder。这可以用来构建一个 来自各种来源的文档(特别是 XdmNode)。这 输入可以通过指定 Stream 或 Uri 来自原始词法 XML, 或者它可能来自使用 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));
            }
    

    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> 
    

    <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:w3.org/TR/xpath20/#ERRXPTY0019
    • 我正在传递参数 XdmNode 输入; //code transformer.SetParameter(new QName("", "", responsedetails), input) where input is
    • 请用详细信息编辑您的问题,以便我们重现问题,我已尝试使用 Saxon 9.5 提出我的建议,并且在传入和识别参数时没有任何问题。
    • 您好 Martin Honnon,感谢您的回复。请找到上面编辑过的问题。请帮帮我
    • 它正在工作 现在更改为
    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多