XSLT - 将节点值呈现为 HTML UI(不显示非转义的 HTML 脚本)

XSLT - render a node value as HTML UI (not display the non-escaped HTML script)

环境 - Dot Net 4.0、C#、XSLT、IE11、WebBrowser 控件

我有一个 XSLT,它处理一个包含转义内容的节点 HTML...

"<b>Hellow World</b>"

我有一个 WebBrowser 控件,它显示来自 XSLT 的转换 HTML。
我使用 <xsl:value-of .. disable-output-escaping="yes"> 它显示带有实际 <b> & </b> 标签的 HTML 文本的未转义值。

我想呈现粗体文本而不显示生成粗体标签的未转义HTML脚本。

下行显示未转义的 HTML 代码,而我实际上想 显示/渲染 HTML UI

<xsl:value-of select="orderDetails/HTMLData" disable-output-escaping="yes"/>

编辑

我正在使用 C# 代码应用 XSLT 转换并在 IE11/Chrome 上的页面上显示输出。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="assetTypeText" ></xsl:param>
  <xsl:template match="/">

    <table border="1" class="mainTable">

      <!--Header-->
      <tr>
        <td class="tdMainHeader">
          <xsl:value-of select="$assetTypeText" /> - <xsl:value-of select="//order/execOrderID/entityOID"></xsl:value-of>
        </td>
      </tr>

      <!--Client Information-->
      <tr class="trMain">
        <table class="InnerMainTable" >
          <tr>
            <td class="tdH2" colspan="2" >Client Information:</td>
          </tr>
          <tr>
            <td colspan="2" class="tdH4">
              <table align="left">
                <tr>
                  <td class="tdInnerTableHeader">DESI</td>
                  <td class="tdInnerTableHeader">ACCOUNT</td>
                 <td class="tdInnerTableHeader">Markup Type</td>
                  <td class="tdInnerTableHeader">Markup</td>
                </tr>
                <xsl:for-each select="//allocation">
                  <tr>
                    <td class="tdInnerTableValue" style="width:20%">
                      <xsl:value-of select="clientDetails/clientID" />
                    </td>
                    <td class="tdInnerTableValue" style="width:20%">
                      <xsl:value-of select="clientDetails/accountID" />
                    </td>
                    <td class="tdInnerTableValue" style="width:20%">
                      <xsl:apply-templates select="charges/charge/chargeFormula" mode="enum"/>
                    </td>
                    <td class="tdInnerTableValue" style="width:20%">
                      <xsl:value-of select="charges/charge/chargeRate" />
                    </td>
                  </tr>
                </xsl:for-each>
              </table>
            </td>
          </tr>
        </table>
      </tr>

      <!--Security Details-->
      <tr class="trMain11">
        <table class="InnerMainTable" border="0">
          <tr class="trMain11">
            <td class="tdH2" >Security Details</td>
          </tr>
          <tr class="trMain11">
            <td colspan="2" class="tdH4">
              <table align="left" class="InnerSecurityTable">
                <tr>
                  <td class="tdSecurityHeaders" style="width:20%">Asset Class:</td>
                  <td class="tdSecurityValue" style="width:80%">
                    <xsl:value-of select="$assetTypeText" />
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </tr>

      <!--Order Details-->
      <tr> 
        <table class="InnerMainTable" border="0">
          <tr>
            <td class="tdH2" colspan="2">Order Details</td>
          </tr>
          <tr>
            <td class="tdInnerOrderDetailsTableValue" colspan="2" >
              <!--Replace this DIV with current template-->
              <div class="TemplateDiv" id="content">
                <xsl:value-of select="orderDetails/HTMLData" disable-output-escaping="yes"/>
              </div>
            </td>
          </tr>
        </table>
      </tr>
    </table>
  </xsl:template>

要转换的 C# 代码

Assembly asm = Assembly.GetExecutingAssembly();
Stream configStream = asm.GetManifestResourceStream(Xslt); //Fetching XSLT File Location from config
XmlTextReader configReader = new XmlTextReader(configStream);
myXslTrans.Load(configReader); //Reading XSLT File
StringBuilder sb = new StringBuilder();
MemoryStream inputStream = new MemoryStream(myXml); //this contains the embedded HTML Code ... orderDetails/HTMLData
XmlReader inputXmlReader = XmlTextReader.Create(inputStream);
MemoryStream memOutputStream = new MemoryStream();

//Perform Transformation
myXslTrans.Transform(inputXmlReader, new XsltArgumentList(), memOutputStream);
memOutputStream.Flush();
memOutputStream.Position = 0;
StreamReader reader = new StreamReader(memOutputStream);
sb.Append(reader.ReadToEnd());
MyWebBrowserControl.NavigateToString(sb.ToString()); //Displays the HTML Content

如何实现?

我无法重现问题,使用 XslCompiledTransform 和 StringWriter 来捕获结果;我使用的 XML 示例是

<root>
  <html>&lt;b&gt;Hello World&lt;/b&gt;</html>
</root> 

XSLT 示例是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="html">
    <xsl:value-of select="." disable-output-escaping="yes"/>
  </xsl:template>
</xsl:stylesheet>

C#/.NET 4.0 代码是

        XslCompiledTransform proc = new XslCompiledTransform();

        proc.Load("XSLTFile1.xslt");

        using (StringWriter sw = new StringWriter())
        {
            proc.Transform("XMLFile1.xml", null, sw);
            wb1.NavigateToString(sw.ToString());
        }

该代码位于 WPF 按钮的单击处理程序中,而 wb1 是 WebBrowser 控件,它将 "Hello Word" 呈现为粗体文本。