通过XML / XSLT处理链保留空白区域

时间:2011-06-01 17:24:23

标签: xml xslt whitespace

  1. 用户在浏览器中的多行文本框中键入文本
  2. 数据作为XML代码段的一部分存储在SQL Server xml列中
  3. XML片段后来被合并到更大的xml文档中
  4. 文档通过XSLT处理成HTML电子邮件
  5. 收件人应该看到原来的换行符
  6. 我试过了:

    • CDATA(由SQL删除)
    • <PRE>标记在NL字符的注释和编码周围的输出中
    • 数据中的
    • 编码<BR>标记(不会在HTML中解码)

    这可以在不重新设计所有内容的情况下完成吗?

    评论中的每个请求,这是实际代码:

    XSL

    <TD>
        <xsl:value-of select="//MemoComment"/>
    </TD>
    

    输入数据到XSLT的变化

    1. <MemoComment>Previous job: Associate, Boston<br/>Test1<br/>Test2</MemoComment>
    2. <MemoComment>Previous job: Associate, Boston &amp;#xA;Test1 &amp;#xA;Test2</MemoComment>
    3. <MemoComment>Previous job: Associate, Boston&amp;lt;br/&amp;gt;Test1&lt;br/&gt;Test2</MemoComment>
    4. 对应的XSLT结果

      1. <TD>Previous job: Associate, BostonTest1Test2</TD>
      2. <TD>Previous job: Associate, Boston&amp;#xA;Test1&amp;#xA;Test2</TD>
      3. <TD>Previous job: Associate, Boston&amp;lt;br/&amp;gt;Test1&lt;br/&gt;Test2</TD>
      4. 在Outlook中无法正确呈现。

2 个答案:

答案 0 :(得分:3)

您遇到问题的原因是您使用了<xsl:value-of>

<TD>
    <xsl:value-of select="//MemoComment"/>
</TD>

当您确实需要<xsl:copy-of>

<TD>
    <xsl:copy-of select="//MemoComment/node()"/>
</TD>

<xsl:value-of>仅选择所选节点的字符串值。你真正想要的是复制整个节点,包括它包含的元素。然后,您可以将数据保存为格式化的XHTML片段,而无需转义元素语法(输入列表中的格式编号为1)。

经常不鼓励使用disabe-output-escaping="yes",因为它可能导致输出格式错误的XML。此外,所有XSLT处理器都没有实现此功能,因为它实际上只在文档被序列化时生效,如果输出文档作为数据结构从处理器传递,则可能没有任何效果。

答案 1 :(得分:1)

尝试在文本中嵌入转义的<br>元素,并将<xsl:value-of>元素的disable-output-escaping属性设置为yes

<MemoComment>Previous job: Associate, Boston&lt;br/&gt;Test1&lt;br/&gt;Test2</MemoComment>

<xsl:value-of select="//MemoComment" disable-output-escaping="yes" />
相关问题