このデータを含むソース xml があります。
<add>
<doc>
<field name="Body"><![CDATA[Line break 1\r\n\r\nline break 2\r\n\r\nline break 3\r\n\r\n Some more text.]]>
</field>
</add>
XslCompiledTransform を使用して、この xslt で変換しています。
<xsl:template match="add">
<add>
<xsl:for-each select="doc">
<doc>
<xsl:apply-templates select="@* | node()" />
</doc>
</xsl:for-each>
</add>
</xsl:template>
したがって、Body フィールドはそのまま通過する必要があります。変換を実行する C# コードは次のとおりです。
XmlDocument source = new XmlDocument();
StringReader reader = new StringReader("My source xml comes in here");
source.Load(reader);
XslCompiledTransform transformer = new XslCompiledTransform(false);
transformer.Load("xslt Path");
XmlWriterSettings settings = transformer.OutputSettings.Clone();
settings.NewLineHandling = NewLineHandling.Replace;
settings.NewLineChars = "\r\n";
StringBuilder builder = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(builder, settings))
{
transformer.Transform(source, this.xsltArgs, writer);
}
string transformedXml = builder.ToString();
この変換の結果は次のとおりです。
<?xml version="1.0" encoding="utf-16"?>
<add>
<doc>
<field name="Body">Line break 1 line break 2 line break 3 Some more text.</field>
</doc>
</add>
ご覧のとおり、CDATA と改行の両方が削除されています。この段階で CDATA を削除しても問題ありませんが、改行は保持する必要があります。NewLineHandling
との設定をどのように組み合わせてNewLineChars
使用しても (実際には、それらを完全に省略しても)、同じ結果が得られます。
私がしなければならないことは他にありますか?