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

Xsl Transformation Changes <i></i> to <i />

我正在尝试转换以下 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" />,由于标签关闭,我的显示中断了。

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

If your style sheet uses the xsl:output element and the output type is an XmlWriter object, you should use the XslCompiledTransform.OutputSettings property when you create the XmlWriter object. The XslCompiledTransform.OutputSettings property returns an XmlWriterSettings object that contains information derived from the xsl:output element of a compiled style sheet. This XmlWriterSettings object can be passed to the XmlWriter.Create method to create an XmlWriter object with the correct settings.

因此,您需要在此处使用 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;
    }