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><b>Hello World</b></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" 呈现为粗体文本。
环境 - 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><b>Hello World</b></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" 呈现为粗体文本。