【问题标题】:Line breaks in XSLT formatted code documentation (xml)XSLT 格式代码文档 (xml) 中的换行符
【发布时间】:2012-06-26 20:28:52
【问题描述】:

我们基于 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>

【问题讨论】:

    标签: c# .net xml xslt


    【解决方案1】:

    你需要了解&lt;xsl:value-of&gt;&lt;xsl:copy-of&gt;的区别。

    &lt;xsl:value-of&gt; 仅将select 属性表达式中指定的字符串值 复制到输出。这排除任何元素(所以&lt;br/&gt; 不会出现在输出中)。

    另一方面,`&lt;xsl:copy-of&gt;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】:

    根据您生成原始 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>
    

    【讨论】:

    • 这可行,但它只是不可读。这些 cmets 是从 XML 文档(来自 VS)生成的。没有人会自己写这些,除非这些(以某种方式)被其他工具转换,这增加了过程的复杂性......
    • 对,我只是想指出正确的方向。我在使用 Perl 的 XML 解析器时遇到了一些类似的错误。确切的选项 - 当然会在两者之间有所不同,但这是您想要走的一般路径。 HTML标签要么需要转义,要么你需要告诉你的解析器盲目地抓取元素&lt;summary&gt;的所有文本而不解释子标签(&lt;br /&gt;
    【解决方案3】:

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

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

    查看更新的 cmets 并做出一些猜测,我认为您的问题是您使用的是 xsl:value-of,它只获取节点的文本,而不是 xsl:copy-of,它会得到节点的文本,以及&lt;br/&gt; 元素。尝试替换这个:

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

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

    您的另一个选择是转义&lt;br/&gt;,使其作为文本而不是子节点出现,并保持禁用输出转义。

    【讨论】:

    • 在我原来的问题中添加了输出。
    • 看起来输出 XML 与输入 XML 不对应。你想要的所有换行符在 XML 中都有
      s 吗?
    • 稍微了解一下copy-of和value-of之间的区别,这似乎是我所追求的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2012-01-12
    • 2023-03-25
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多