是否可以在XSLT中禁用 - 输出 - 转义两次

时间:2016-10-09 02:42:56

标签: html xml xslt

我有编码HTML数据的XML。我试图渲染数据,但似乎无法弄清楚如何。我能说的最好的是我需要let c = ContextMaker.makeMeAContext() 两次,但不知道该怎么做。

例如,这是我的XML片段:

disable-output-escaping="yes"

我的XSLT正在输出HTML。这是具有各种选项的呈现输出(HTML源)

  • <root> <node value="&amp;lt;b&amp;gt;body&amp;lt;/b&amp;gt;" /> </root> 输出<xsl:value-of select="@value" />
  • &amp;lt;b&amp;gt;hi&amp;lt;/b&amp;gt;输出<xsl:value-of select="@value" disable-output-escaping="yes" />

我希望将&lt;b&gt;hi&lt;/b&gt;输出到HTML源代码,以便将其实际渲染为粗体。那有意义吗?这可能吗?

3 个答案:

答案 0 :(得分:0)

假设Sharepoint作为Microsoft .NET产品使用XslCompiledTransform,您可以尝试使用扩展&#34;脚本&#34;来实现unescaping和解析。 (嵌入在XSLT中的C#或VB或JScript.NET代码)如下:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:mf="http://example.com/mf"
  exclude-result-prefixes="msxsl mf">


  <msxsl:script language="C#" implements-prefix="mf">
    <msxsl:using namespace="System.IO"/>
    public string Unescape(string input)
    {
    XmlDocument doc = new XmlDocument();
    XmlDocumentFragment frag = doc.CreateDocumentFragment();
    frag.InnerXml = input;
    return frag.InnerText;
    }

    public XPathNavigator ParseXml(string xmlInput)
    {
    using (StringReader sr = new StringReader(xmlInput))
    {
    return new XPathDocument(sr).CreateNavigator();
    }
    }
  </msxsl:script>

  <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

  <xsl:template match="/">
    <html>
      <head>
        <title>Test</title>
      </head>
      <xsl:apply-templates/>
    </html>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node">
    <div>
      <xsl:copy-of select="mf:ParseXml(mf:Unescape(@value))" />
    </div>
  </xsl:template>

</xsl:stylesheet>

如果您可以访问支持XPath 3函数parse-xmlparse-xml-fragment的XSLT处理器(如任何版本的Saxon 9.7或Exselt或最新的Altova或XmlPrime),您可以编写该模板而无需扩展函数(在version="3.0"样式表中)为

<xsl:template match="node">
    <div>
        <xsl:copy-of select="parse-xml(string(parse-xml-fragment(@value)))"/>
    </div>
</xsl:template>

答案 1 :(得分:0)

转义是将var guardedLocation = L.latLng(...); var thresholdDistance = 100; // In meters var start; function updateLocation(){ var userPosition = L.latLng(lat, lng); user.setLatLng(userPosition); if(map.distance(userPosition, guardedLocation) <= thresholdDistance) { document.getElementById('setButton').style.background = 'purple' soundAlarm(); isSet = false; clearInterval(start); } } start = setInterval(updateLocation, 5000); 转变为<的过程。如果您停用了转义功能,它会将&lt;保留为<。您希望实现的目标是将<变为&lt;,这通常被称为“unes​​caping”。

在正常的事件过程中,解析器执行unescaping,而序列化程序执行转义。因此,如果你想要浏览字符,你需要让它们通过一个解析过程,这意味着你需要获取<属性的内容,并通过像fn:parse-xml-fragment()这样的操作。在XPath 3.0中,或在您选择的处理器中的等效扩展函数。

答案 2 :(得分:0)

使用disable-output-escaping输出结果,然后使用disable-output-escaping在另一个XSL中再次对其进行处理。