xsl转换xmlwriter输出只返回文本C#

时间:2012-08-19 16:42:56

标签: c# xml xslt xmlwriter

此转换的输出仅包含文本,但我想要HTML和文本输出。我需要做些什么来改变呢?

我正在使用VS 2010

当前示例输出:

Jones Martin Kelley Marshall

注意我也在xsl中有这个,但它没有在我的代码示例中显示:

 xsl:output
    standalone="no"
    method="xml"
    indent="yes"
    omit-xml-declaration="no"
    version="1.0" 

的xsl:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

    <xsl:for-each select="/people">

      <div class="lastnames">
        <ul>
          <li>
            <xsl:value-of select="lastname" disable-output-escaping="yes" />
          </li>
        </ul>
      </div>

    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

C#:

XslCompiledTransform xslt = new XslCompiledTransform();

xslt.Load(xslPath);

using (XmlWriter writer = XmlWriter.Create(outPath + 
                                          fileName + 
                                          "." +
                                            fileExt
                                         , xslt.OutputSettings))
{
    xslt.Transform(fileNode, null, writer);
    writer.Flush();
    writer.Close();
}

2 个答案:

答案 0 :(得分:1)

如果没有看到输入数据,很难确定出现了什么问题。但首先我建议检查你的xsl:output元素;你说它出现在输入中“但没有显示在[代码示例中”]。这本身就让我怀疑。事实上,当你显示它时,它没有显示为XML元素,这让我倍加怀疑。

它们与您实际提出的问题无关,但在阅读您的代码时还有其他一些问题:

  • 您展示的xsl:output使用method="xml",但您没有制作XHTML;您有没有使用method="html"
  • 的原因
  • 为什么在显示人名时禁用输出转义?您是否希望输入数据的名称少于人?如果确实如此,您是否想要创建格式错误的输出而不是将字符数据输出?
  • 单个模板中的xsl:for-each没有做任何工作(除非在根元素未命名为people的情况下使样式表无声地完成而没有输出)。如果用

    替换模板,那么样式表会更加惯用
    <xsl:template match="people">
      <div class="lastnames">
        <ul>
          <xsl:apply-templates/>
        </ul>
      </div>
    </xsl:template>
    <xsl:template match="lastname">
      <li>
        <xsl:apply-templates/>
      </li>
    </xsl:template>
  • 答案 1 :(得分:1)

    这个简单的转型

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="people">
      <div class="lastnames">
       <ul>
         <xsl:apply-templates/>
       </ul>
      </div>
     </xsl:template>
    
     <xsl:template match="lastname">
      <li><xsl:apply-templates/></li>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于此XML文档(未提供!!!):

    <people>
     <lastname>Jones</lastname>
     <lastname>Martin</lastname>
     <lastname>Kelley</lastname>
     <lastname>Marshall</lastname>
    </people>
    

    会产生想要的正确结果:

    <div class="lastnames">
      <ul>
        <li>Jones</li>
        <li>Martin</li>
        <li>Kelley</li>
        <li>Marshall</li>
      </ul>
    </div>
    

    浏览器按预期显示:

      
          
    • 琼斯
    •     
    • 马丁
    •     
    • 凯利
    •     
    • 马歇尔
    •