【问题标题】:hInserting line-break into XML so that it appears after XSL rendering in VB.NETh在 XML 中插入换行符,以便它在 VB.NET 中的 XSL 呈现之后出现
【发布时间】:2013-12-19 20:11:09
【问题描述】:

我有一个System.xml.xmlDocument() 对象,它使用 XSL 呈现到网页上。我想在 XML 对象的某些节点内插入一个“换行符”,因此当使用 XSLT 呈现 XML 时,那里有一个实际的换行符。我执行此操作的代码如下所示:

Dim parentNodes As System.Xml.XmlNodeList = objOutput.SelectNodes("//PARENT")
                Dim currentParentValue As String = String.Empty
                Dim resultParent As String = String.Empty
                For Each par As System.Xml.XmlNode In parentNodes
                    currentParentValue = par.InnerText
                    Dim parArray As String() = currentParentValue.Split(";")
                    If parArray.Length > 2 Then
                        resultParent = String.Empty
                        Dim parCounter As Integer = 0
                        For Each Parent As String In parArray
                            parCounter = parCounter + 1
                            resultParent = resultParent + Parent + "; "
                            If (parCounter Mod 2) = 0 Then
                                resultParent = resultParent + "
"
                            End If
                        Next
                    End If
                    par.InnerText = resultParent
                Next

在 XSL 中:

<td width="50%" nowrap="nowrap">
<xsl:value-of select="STUDENT_DETAILS/PARENT"/>
</td> 

但是,xmlDocument 似乎自动转义了下一行字符,所以它只是在页面上显示为文本,谁能告诉如何解决这个问题?

【问题讨论】:

  • 您的 XSLT 调用在哪里?还请添加输入 XML 和所需输出的相关示例。目前这个问题相当模糊。
  • @Tomalak 我将尝试编辑以添加它,但我看不出它会产生什么影响,我正在尝试使用 &amp;#xA; 在节点内插入换行符并想要如果它在 HTML 页面上显示为实际的换行符,那么 XML 的格式会有什么不同?
  • 因为您可以(并且可能应该)在 XSLT 中正确执行此操作,而不是事后修改转换后的 XML。但是要看看这是否可行,我需要查看源代码。 (在任何其他情况下,问题都与 XSLT 无关,可以完全删除标签)
  • AFAIK,为了在 HTML 页面上看到实际的换行符,您需要插入 &lt;br/&gt; 标签,而不是换行符。
  • 查看thisthis 了解如何在XSLT 中拆分字符串的示例。

标签: html xml vb.net xslt


【解决方案1】:

如果你改变了

<td width="50%" nowrap="nowrap">
<xsl:value-of select="STUDENT_DETAILS/PARENT"/>
</td> 

<td width="50%" nowrap="nowrap">
<pre>
  <xsl:value-of select="STUDENT_DETAILS/PARENT"/>
</pre>
</td> 

浏览器将呈现换行符。

【讨论】:

  • 没用,我想我会按照其他人的建议去尝试在 XSLT 中创建一个递归函数。
【解决方案2】:

您可以在节点旁边简单地附加“”,这将在您的两个节点之间插入换行符。

注意事项:

请去掉 br 前的 '。

【讨论】:

    【解决方案3】:

    你的问题围绕这条线解决了......

     resultParent = resultParent + "&#xA;"
    

    现在,您可能正尝试像这样输出您的 XML:

    <PARENT>George Aaron&#xA; Susan Lee Aaron&#xA; Richard Elliot Aaron&#xA;</PARENT>
    

    但是,这个转义的&amp;#xA; 实体仅在文档尚未被解析时才相关。如果它是一个文本文档,随后会被读取并解析为 XML 文档,那么实体将按预期进行处理。但是您正在处理一个已经被解析的 XML 文档。因此,当您执行resultParent = resultParent + "&amp;#xA;" 时,它实际上是将一个包含五个字符的字符串插入到现有文本节点中,并且由于&amp; 是一个特殊字符,它会被转义。

    现在,你可以做的就是这样......

     resultParent = resultParent + chr(10)
    

    但最终这将被证明是徒劳的,因为 HTML 无法识别换行符,因此您必须编写 XSLT 以将换行符替换为 &lt;br /&gt; 元素。

    如果您想在您的 VB 代码中执行此操作,您可以自己创建新的 br 元素并插入它们

    For Each par As System.Xml.XmlNode In parentNodes
      currentParentValue = par.InnerText
      par.InnerText = String.Empty
      Dim parArray As String() = currentParentValue.Split(";")
      For Each Parent As String In parArray
        If Parent.Length > 0 Then
          Dim person As XmlText = objOutput.CreateTextNode(Parent)
          par.AppendChild(person)
          par.AppendChild(objOutput.CreateElement("br"))
        End If
      Next
    Next
    

    因此,这需要 PARENT 节点,将其清除,然后添加一个文本节点,并为每个父节点添加新的 br 元素。然后输出会像这样,使用 XSLT 输出为 HTML 会更容易

    <PARENT>George Aaron<br />Susan Lee Aaron<br />Richard Elliot Aaron<br /></PARENT>
    

    (如果需要,在每个第二个父级之后添加 br 应该不会太难)。

    但是,将“展示性”信息放入 XML 文件可能不一定是个好主意。假设您后来不得不将 XML 转换为不同的格式?另一种方法是将每个父元素分成自己的元素。

    For Each par As System.Xml.XmlNode In parentNodes
      currentParentValue = par.InnerText
      par.InnerText = String.Empty
      Dim parArray As String() = currentParentValue.Split(";")
      For Each Parent As String In parArray
        If Parent.Length > 0 Then
          Dim person As XmlElement = objOutput.CreateElement("PERSON")
          person.InnerText = Parent.Trim()
          par.AppendChild(person)
        End If
      Next
    Next
    

    这会输出类似这样的东西..

    <PARENT>
       <PERSON>George Aaron</PERSON>
       <PERSON>Susan Lee Aaron</PERSON>
       <PERSON>Richard Elliot Aaron</PERSON>
       <PERSON>Albert Smith</PERSON>
    </PARENT>
    

    将其显示为 HTML 也很简单

    提示:要以两个为一组显示,您的 XSLT 可能看起来像这样......

    <xsl:for-each select="PERSON[postion() mod 2 = 1]">
        <xsl:value-of select=".">;
        <xsl:value-of select="following-sibling::PERSON[1]" />
        <br />
    </xsl:for-each>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-22
      • 2013-01-15
      • 2018-11-07
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      • 2019-05-08
      相关资源
      最近更新 更多