cdata-section-elements 不工作

2024-03-14

我试图通过设置全局参数在通过 XSLT(使用 Saxon-HE v9.7.0.14)生成的 xml 文件中设置密码。

密码可以包含任何字符,因此需要将其放在CDATA部分。

我试图通过设置来实现这一点cdata-section-elements我的 xslt 的属性xsl:output包含密码元素名称的元素:

<xsl:output method="xml" indent="yes" cdata-section-elements="password"/>

这是行不通的。我在下面提供了示例代码、输入、xslt、当前输出和所需输出。

我需要更改什么才能获取密码CDATA部分?

Program:

using System;
using System.IO;
using Saxon.Api;

namespace XsltTest {
    class Program {
        static void Main(string[] args) {
            var xslt = new FileInfo(@"transform.xslt");
            var input = new FileInfo(@"input.xml");
            var output = new FileInfo(@"output.xml");
            var processor = new Processor();
            var compiler = processor.NewXsltCompiler();
            var executable = compiler.Compile(new Uri(xslt.FullName));
            var transformer = executable.Load();
            var destination = new DomDestination();
            using (var inputStream = input.OpenRead()) {               
                transformer.SetInputStream(inputStream, new Uri(Path.GetTempPath()));
                transformer.SetParameter(
                    new QName("password"),
                    new XdmAtomicValue("secret"));
                transformer.Run(destination);
            }
            destination.XmlDocument.Save(output.FullName);
        }
    }
}

变换.xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="xml" indent="yes" cdata-section-elements="password"/>
  <xsl:param name="password" />
  <xsl:template match="@* | node()">
    <bar>
      <username>
        <xsl:value-of select="//username"/>
      </username>
      <password>
        <xsl:value-of select="$password"/>
      </password>
    </bar>
  </xsl:template>
</xsl:stylesheet>

输入.xml:

<?xml version="1.0" encoding="utf-8" ?>
<foo>
  <username>john</username>
</foo>

输出.xml:

<bar>
  <username>john</username>
  <password>secret</password>
</bar>

密码未放入CDATA部分。

期望的结果:

<bar>
  <username>john</username>
  <password><![CDATA[secret]]></password>
</bar>

上的选项xsl:output影响序列化器的操作,如果输出未序列化,则它们无效。您正在写入 DomDestination 而不是 Serializer(然后使用 DOM 方法序列化 DOM,该方法对 XSLT xsl:output 声明一无所知)。

无论如何,您的前提都是错误的:“密码可以包含任何字符,因此需要将其放在 CDATA 部分中。”如果没有 cdata-section-elements,特殊字符将使用实体引用进行序列化,例如&lt; and &amp;,应该可以正常工作。

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

cdata-section-elements 不工作 的相关文章

随机推荐