【问题标题】:Xsl Transformation Changes <i></i> to <i />Xsl 转换将 <i></i> 更改为 <i />
【发布时间】:2018-04-06 09:47:28
【问题描述】:

我正在尝试转换以下 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>

对于&lt;i class="fa fa-check-circle"&gt;&lt;/i&gt;Step 1,我收到以下&lt;i class="fa fa-check-circle" /&gt;,由于关闭标签,我的显示中断了。

【问题讨论】:

  • 尝试将&lt;xsl:output method="html" /&gt; 添加到您的样式表中
  • @TimC 我按照您的建议添加,并更新了我的问题,但结果仍然相同。

标签: html xml xslt tags transformation


【解决方案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;
    }

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多