Xsl转换将<i> </i>更改为<i>

时间:2018-04-06 09:47:29

标签: html xml xslt tags transformation

我正在尝试转换以下Xsl样式表。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0">
  <xsl:output method="html" version="4.0" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/TestPage" xml:space="preserve" >
    <ul>
      <li class="first complete-tab">
        <i class="fa fa-check-circle"></i>Step 1
      </li>
      <li class="active">
        <i class="fa fa-pencil"></i>Step 2
      </li>
      <li class="last">Step 3</li>
    </ul>
  </xsl:template>
</xsl:stylesheet>

我正在使用的代码如下。

class Program
{
    static void Main(string[] args)
    {
        string xslFile = "C:\\Projects\\Test.xsl";

        XmlDocument doc = new XmlDocument();
        XmlElement rootElement = doc.CreateElement("TestPage");
        doc.AppendChild(rootElement);

        string result = TransformDoc(doc, xslFile);
    }

    private static string TransformDoc(XmlDocument doc, string transformPath)
    {
        return TransformDoc(doc.CreateNavigator(), transformPath);
    }

    static string TransformDoc(XPathNavigator nav, string transformPath, XsltArgumentList args = null)
    {
        StringBuilder buffer = new StringBuilder();
        string result = "A transformation Error Has Occurred";

        using (StringWriter stringWriter = new StringWriter(buffer))
        using (XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter))
        {

            XslCompiledTransform oTransform = new XslCompiledTransform();
            XsltSettings oSettings = new XsltSettings(false, true);

            oTransform.Load(transformPath, oSettings, null);
            if (args == null)
                oTransform.Transform(nav, xmlWriter);
            else
                oTransform.Transform(nav, args, xmlWriter);
            result = buffer.ToString();
        }
        return result;
    }
}

上面的代码转换了Xsl文件,但是我发现我没有得到所需的输出。

结果是

<ul>
  <li class="first complete-tab">
    <i class="fa fa-check-circle" />Step 1
  </li>
  <li class="active">
    <i class="fa fa-pencil" />Step 2
  </li>
  <li class="last">Step 3</li>
</ul>

对于<i class="fa fa-check-circle"></i>Step 1,我收到以下<i class="fa fa-check-circle" />因为关闭了代码而导致我的显示失效。

1 个答案:

答案 0 :(得分:1)

根据https://docs.microsoft.com/en-us/dotnet/standard/data/xml/output-options-on-the-xslcompiledtransform-class它说......

  

如果样式表使用xsl:output元素,则输出类型为   一个XmlWriter对象,你应该使用   创建时的XslCompiledTransform.OutputSettings属性   XmlWriter对象。 XslCompiledTransform.OutputSettings属性   返回包含派生信息的XmlWriterSettings对象   来自已编译样式表的xsl:output元素。这个   可以将XmlWriterSettings对象传递给XmlWriter.Create方法   使用正确的设置创建XmlWriter对象。

所以,你需要在这里使用XmlWriter并在创建时将OutputSettings传递给它...

    static string TransformDoc(XPathNavigator nav, string transformPath, XsltArgumentList args = null)
    {
        StringBuilder buffer = new StringBuilder();
        string result = "A transformation Error Has Occurred";

        XslCompiledTransform oTransform = new XslCompiledTransform();
        XsltSettings oSettings = new XsltSettings(false, true);
        oTransform.Load(transformPath, oSettings, null);

        using (StringWriter stringWriter = new StringWriter(buffer))
        using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, oTransform.OutputSettings))
        {
            if (args == null)
                oTransform.Transform(nav, xmlWriter);
            else
                oTransform.Transform(nav, args, xmlWriter);
            result = buffer.ToString();
        }
        return result;
    }