【问题标题】:Saxon API (saxon9HE) output is not generating proper xmlSaxon API (saxon9HE) 输出未生成正确的 xml
【发布时间】:2017-03-29 14:49:15
【问题描述】:

我正在使用下面的代码进行 xsl 转换。

var processor = new Processor();


XsltCompiler xslComp = processor.NewXsltCompiler();
            XsltExecutable xslExec = xslComp.Compile(xslUri);
            XsltTransformer xslTrans = xslExec.Load();
            XdmDestination xdmD = new XdmDestination();
            Serializer serializer = processor.NewSerializer();

            using (FileStream fs = File.Open(xmlPath, FileMode.Open))
            {
                xslTrans.SetInputStream(fs, schemaUri); // set baseUri
                xslTrans.Run(xdmD);
            }

            XdmNode value = null;

            if (xdmD != null)
            {
                value = xdmD.XdmNode;
            }

这里是示例输入 xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" >
  <xsl:output method="xml" indent="no"/>

  <xsl:template match="/">
    <xsl:value-of select="concat('&lt;?xml',substring-after(//root/text(),'&lt;?xml'))" disable-output-escaping="yes"
/>
  </xsl:template>
</xsl:stylesheet>

示例输入 xml:

<root>
<![CDATA[

<?xml version="1.0" encoding="ISO-8859-1"?>
<nf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://www.cisco.com/nxos:1.0:vms">
<nf:data>
  <show>
   <svs>
    <connections>
        <conn-name>qa-gdc1</conn-name>        
    </connections>
   </svs>
  </show>
</nf:data>
</nf:rpc-reply>

]]>
</root>

输出:

&lt?xml version="1.0" encoding="ISO-8859-1"?&gt
&ltnf:rpc-reply xmlns:nf="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns="http://www.cisco.com/nxos:1.0:vms"&gt
&ltnf:data&gt
  &ltshow&gt
   &ltsvs&gt
    &ltconnections&gt
        &ltconn-name&gt;qa-gdc1&lt;/conn-name&gt      
    &lt/connections&gt
   &lt/svs&gt
  &lt/show&gt
&lt/nf:data&gt
&lt/nf:rpc-reply&gt

【问题讨论】:

  • 那是哪个版本的 Saxon HE?在 9.7 中,您可以使用 XPath 3 parse-xml 来解析嵌入的 XML,然后期待 XdmNode 作为结果也是有意义的。如果您想依赖禁用输出转义,那么我认为您需要确保首先对结果进行序列化。

标签: c# xslt saxon


【解决方案1】:

(正如我在私人电子邮件中已经解释过的)

disable-output-escaping 是对序列化器的指令。因此,如果结果树没有被序列化,它就没有效果。 (您正在创建一个序列化程序,但您没有将其用作转换的目标。)

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2021-03-18
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多