0

このデータを含むソース 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使用​​しても (実際には、それらを完全に省略しても)、同じ結果が得られます。

私がしなければならないことは他にありますか?

4

2 に答える 2

0

これは、xslt ファイルを次のように変更することで解決されました。

<xsl:template match="add">
    <add>
        <xsl:for-each select="doc">
            <doc>
                <xsl:copy-of select="field[@name = 'Body']" />
                <xsl:apply-templates select="@* | node()" />
            </doc>
        </xsl:for-each>
    </add>
</xsl:template>

<xsl:template match="field[@name = 'Body']" />

<xsl:template match="field[@name = 'Source']">
    <field>
        <xsl:attribute name="name">Source</xsl:attribute>
        <xsl:value-of select="normalize-space(.)"/>
    </field>
</xsl:template>

<xsl:template match="field[@name = 'Section']">
    <field>
        <xsl:attribute name="name">Section</xsl:attribute>
        BikesForSale
    </field>
</xsl:template>

<xsl:template match="field[@name = 'FirstSeen']">
    <field>
        <xsl:attribute name="name">PublishedDate</xsl:attribute>
        <xsl:value-of select="."/>
    </field>
</xsl:template>

...more here, removed for brevity.
于 2015-03-30T15:51:03.237 に答える
0

これを追加:

source.PreserveWhitespace = true;

ドキュメントを作成した直後、ロードする前。

または、XML を次のように補足します。

<field name="Body" xml:space="preserve"><![CDATA[etc..
于 2015-03-31T09:50:14.780 に答える