XSLT格式代码文档中的换行符(xml)

时间:2012-06-25 14:58:04

标签: c# .net xml xslt

我们基于WinForms的应用程序获取由Visual Studio生成的文档文件(Xml文档),执行一些XSLT转换并将结果显示在表单内的WebBrowser控件中。

问题是,我们似乎无法显示换行符,例如xml文档中的标签。

例如:

        <member name="T:Genesys.AgentLoginData">
            <summary>
            This is some test summary <br />
            New line here
            </summary>
        </member>

当与XSL转换一起使用时,摘要文本将被截断为一行。

为简化起见,转换会选择摘要文本:

<xsl:template match="member" >
<xsl:value-of select="summary" disable-output-escaping="yes" />
</xsl:template>

我们如何才能正确地在我们的应用程序中的WebBrowser控件中显示新行?

编辑:从WebBrowser控件添加“查看源”的内容。 我所追求的是“这是一种方法”之后的新行,依此类推。 浏览器只需将其显示在一行中。

<?xml version="1.0" encoding="utf-8"?><html xmlns="http://www.w3.org/1999/xhtml"><head><title>Action Help</title><style type="text/css">
          p  {text-indent:200px;}
          li {text-indent:180px;}
          h1 {color:navy;}
          h2 {color:blueviolet}
          h4 {color:navy;}
        </style></head><body><H2 xmlns="">AgentLogin</H2><H1 xmlns=""></H1><h3 xmlns="">
            This is a method 
            And its parameter 
            Check this out
            name</P></body></html>

3 个答案:

答案 0 :(得分:4)

您可能正在寻找xml:space="preserve"指令。有关如何在.net堆栈上处理XSL和空格的文章,请参阅http://msdn.microsoft.com/en-us/library/aa468566.aspx

虽然我刚刚注意到您正在Web浏览器控件中显示生成的转换,这可能意味着您的问题实际上与生成的HTML有关。尝试查看您在控件中显示的内容的来源,并将其添加到您的问题中。

查看更新的注释,并做出一些猜测,我认为你的问题是你正在使用xsl:value-of,它只获取节点的文本,而不是xsl:copy-of,这将获得节点的文本以及<br/>元素。尝试替换它:

<xsl:value-of select="summary" disable-output-escaping="yes" />

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

你的另一个选择是转义<br/>以便它以文本而不是子节点的形式出现,然后保持disable-output-escaping。

答案 1 :(得分:2)

您需要了解<xsl:value-of><xsl:copy-of>之间的区别。

<xsl:value-of>仅将select属性表达式中指定的字符串值复制到输出。此排除了任何元素(因此输出中不存在<br/>)。

另一方面,`<xsl:copy-of>select属性中指定的节点集中的所有节点复制到结果树中。

因此解决方案很简单

<强>替换

<xsl:template match="member" >
  <xsl:value-of select="summary" disable-output-escaping="yes" />
</xsl:template>

<强>与

<xsl:template match="member" >
  <xsl:copy-of select="summary/node()"/>
</xsl:template>

答案 2 :(得分:1)

根据您生成原始xml的方式,您可能需要使用html实体来正确保留这些标记。

http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references

    <member name="T:Genesys.AgentLoginData">
        <summary>
        This is some test summary &lt;br /&gt;
        New line here
        </summary>
    </member>