Ich versuche ein Passwort in einer xml-Datei zu setzen, die über XSLT erzeugt wurde (mit Saxon-HE v9.7.0.14), indem ich einen globalen Parameter festlege.cdata-section-elements funktioniert nicht
Das Kennwort kann beliebige Zeichen enthalten, so dass es in einen Abschnitt CDATA
eingefügt werden muss.
Ich versuche, dies zu erreichen, indem xsl:output
Element das cdata-section-elements
Attribut meines Xslt der Einstellung den Namen des Passworts Element aufzunehmen:
<xsl:output method="xml" indent="yes" cdata-section-elements="password"/>
Das funktioniert nicht. Ich habe Beispielcode, Eingabe, xslt, aktuellen Ausgang und gewünschte Ausgabe darunter eingefügt.
Was muss ich ändern, um das Passwort in einem CDATA
Abschnitt zu erhalten?
Programm:
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>
Das Passwort wird in einem CDATA
Abschnitt nicht setzen.
Wunschergebnis:
<bar>
<username>john</username>
<password><![CDATA[secret]]></password>
</bar>
Danke. Ich habe jetzt 'Serializer' anstelle von' DomDestination' verwendet und es funktioniert. Danke auch für den Kommentar zur Entitätscodierung ohne CDATA. Ich ersetze tatsächlich ein System, das bereits XML-Nachrichten mit dem Passwort in CDATA sendet, und das Team vor mir sagte, sie hätten Probleme, bevor sie CDATA verwenden. Wir haben keine Kontrolle über das externe System, das die Nachrichten liest, daher nahm ich an, dass das Problem nicht am Ende des XML-Codes funktionierte und ich weiß, dass es funktioniert, wenn CDATA verwendet wird. – Ergwun
Das Generieren von XML für Leute, die es inkompetent analysieren, ist nur unwesentlich problematischer als das Lesen von (sogenanntem) XML, das von Leuten erstellt wird, die es inkompetent erzeugen - leider gibt es in unserem Beruf viel Inkompetenz. –