<br/>标签在xml / xsl中

时间:2013-09-19 12:26:44

标签: c# xml xslt

我通过从c#中的richtextbox获取数据生成xml并生成以下xml文件

xml文件

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="task.xsl"?>
<Nodes><sNode><Word>this is a sample text this is a sample text this is a sample        text</Word></sNode></Nodes>

“我为xml制作的xslt如下”     xslt示例

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
<html>
  <body>
    <h2>Rich Text Box</h2>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Data</th>
      </tr>
      <xsl:for-each select="Nodes/sNode">
        <tr>
          <td><xsl:value-of select="word"/></td>              
          </tr>
        </xsl:for-each>
       </table>
     </body>
   </html>
  </xsl:template>
</xsl:stylesheet>

示例输入数据(我在richtextbox中以相同的格式输入以下数据)

this is a sample text
this is a sample text
this is a sample text

我想以相同的格式(在不同的行中)在资源管理器中显示这些数据。 我的代码在

之下
        using (XmlWriter writer = XmlWriter.Create("c:\\Task\\task.xml",settings))
        {

            //writer.WriteRaw("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
            writer.WriteRaw("<?xml-stylesheet type=\"text/xsl\" href=\"task.xsl\"?>");
            writer.WriteStartElement("Nodes");
            writer.WriteStartElement("sNode");
            writer.WriteElementString("Word", words);
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }

我应该在哪里使用<br/>标签。或者我该怎么做才能以相同的格式显示数据。 感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我更喜欢使用se XmlTextWriter而不是使用XmlWriter,因为我不必担心转义任何东西,因为XmlTextWriter会转义所需的字符,但是这些类已被弃用, 另一种方法是明确使用CDATA

CDATA示例

using (XmlWriter writer = XmlWriter.Create("c:\\Task\\task.xml",settings))
{
    //writer.WriteRaw("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
    writer.WriteRaw("<?xml-stylesheet type=\"text/xsl\" href=\"task.xsl\"?>");
    writer.WriteStartElement("Nodes");
    writer.WriteStartElement("sNode");
    writer.WriteStartElement("Work");
    writer.WriteCData("words");
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

XmlTextWriter的示例

string words = "<node>it's my \"node\" & i like it<node><br/>test";
using (XmlTextWriter xtw = new XmlTextWriter(@"c:\xmlTest.xml", Encoding.Unicode))
{
    writer.WriteStartElement("Nodes");
    writer.WriteStartElement("sNode");
    writer.WriteElementString("Word", words);
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

如果您不想使用XmlTextWriter,可以使用

答案 1 :(得分:0)

如果您想要一种非常粗略的方法,只需将输出的文本包装在 pre 元素中

<td>
    <pre><xsl:value-of select="Word"/></pre>
</td>

(顺便说一句,这可能只是你问题中的一个错字,但在你的XML中你有一个 word 元素,但在XSLT中你正在寻找一个 Word 元素。由于XML区分大小写,因此不一样。)

编辑:如果你真的想用 br 元素替换换行符,那么要在XSLT中执行此操作,您将需要一个递归模板。 StackOverflow上可能有很多例子,但是我对这个例子充满了希望

xslt 1.0 string replace function

但是,如果要用新创建的元素替换文本,则需要进行调整,因为它会将文本替换为文本。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <html>
         <body>
            <h2>Rich Text Box</h2>
            <table border="1">
               <tr bgcolor="#9acd32">
                  <th>Data</th>
               </tr>
               <xsl:for-each select="Nodes/sNode">
                  <tr>
                     <td>
                        <xsl:call-template name="replace-string-with-element">
                           <xsl:with-param name="text" select="Word"/>
                           <xsl:with-param name="replace" select="'&#10;'"/>
                           <xsl:with-param name="with" select="'br'"/>
                        </xsl:call-template>
                     </td>
                  </tr>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>

   <xsl:template name="replace-string-with-element">
      <xsl:param name="text"/>
      <xsl:param name="replace"/>
      <xsl:param name="with"/>
      <xsl:choose>
         <xsl:when test="contains($text,$replace)">
            <xsl:value-of select="substring-before($text,$replace)"/>
            <xsl:element name="{$with}"/>
            <xsl:call-template name="replace-string-with-element">
               <xsl:with-param name="text" select="substring-after($text,$replace)"/>
               <xsl:with-param name="replace" select="$replace"/>
               <xsl:with-param name="with" select="$with"/>
            </xsl:call-template>
         </xsl:when>
         <xsl:otherwise>
            <xsl:value-of select="$text"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>
</xsl:stylesheet>

应用于以下XML

<Nodes><sNode>
<Word>this is a sample text 
this is a sample text
this is a sample text
</Word>
</sNode>
</Nodes>

以下是输出

<html>
<body>
<h2>Rich Text Box</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Data</th>
</tr>
<tr>
<td>this is a sample text <br>    this is a sample text<br>    this is a sample text<br>    </td>
</tr>
</table>
</body>
</html>