グローバルパラメータを設定して、XSLT(Saxon-HE v9.7.0.14を使用)で生成されたxmlファイルにパスワードを設定しようとしています。cdata-section-elementsが動作しない
パスワードには任意の文字を使用できるため、CDATA
セクションに入力する必要があります。
xsl:output
要素の
cdata-section-elements
属性を設定することによって、これを達成しようとしています:これは動作しない
<xsl:output method="xml" indent="yes" cdata-section-elements="password"/>
。私は以下のサンプルコード、入力、xslt、現在の出力と望ましい出力を以下に示しました。
CDATA
セクションのパスワードを変更するにはどうすればよいですか?
プログラム:
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);
}
}
}
Transform.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>
input.xmlに:
<?xml version="1.0" encoding="utf-8" ?>
<foo>
<username>john</username>
</foo>
のOutput.xml:
<bar>
<username>john</username>
<password>secret</password>
</bar>
パスワードがCDATA
セクションの内側に置かれていません。
望ましい結果:
<bar>
<username>john</username>
<password><![CDATA[secret]]></password>
</bar>
ありがとうございます。私は 'DomDestination'の代わりに' Serializer'を使いました。 CDATAのないエンティティエンコーディングに関するコメントもありがとうございます。私は実際に既にCDATAのパスワードでXMLメッセージを送信しているシステムを置き換えています。私の前のチームはCDATAを使用する前に問題があると言いました。私たちは外部システムを制御してメッセージを読むことはできません。そのため、問題がXMLを適切に処理していないと判断し、CDATAを使用するときに問題なく動作することがわかりました。 – Ergwun
無意識のうちに解析する人のためにXMLを生成することは、それを無力に生成する人が作成した(いわゆる)XMLを読むことよりほんの少しだけ面倒ではありません。 –