0

我通过从 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/>标签。或者我应该怎么做才能以相同的格式显示数据。感谢您的任何帮助

4

2 回答 2

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,您可以使用

于 2013-09-19T12:41:27.560 回答
0

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

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

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

编辑:如果您真的想用br元素替换换行符,那么要在 XSLT 中执行此操作,您将需要一个递归模板。StackOverflow 上可能有很多示例,但我对此很感兴趣

xslt 1.0 字符串替换功能

但是,这需要进行调整,因为当您想用新创建的元素替换文本时,它会用文本替换文本。

试试这个 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>
于 2013-09-19T13:03:21.053 回答