如何将模板应用于转义的xml字符串

时间:2017-03-23 17:44:18

标签: xslt

我正在使用在ASP上运行的CMS,该CMS具有用于数据输入的文本字段。它以<fieldname>escaped field val</fieldname>的形式将该数据传递给XSLT 1.0渲染模板。所有字符都转义为它们的HTML等价物,因此如果我在CMS中输入xml字符串

<test><foo><bar>bar val</bar></foo><something>something val</something></test>

渲染模板的值为

&lt;test&gt;&lt;foo&gt;&lt;bar&gt;bar val&lt;/bar&gt;&lt;/foo&gt;&lt;something&gt;something val&lt;/something&gt;&lt;/test&gt;

是否可以将转义的xml字符串转换为实际的xml我可以将模板应用到?

这是一个模板,其中包含了我迄今为止尝试过的一些内容。我能够在模板中运行C#,所以我尝试了各种组合的disable-output-escaping和我自己的手动C#方法,但无论如何,当我将它传递给node-set时,它不会成为我能做的事情。将模板应用于。

    

<msxsl:script language="C#" implements-prefix="user">
    public string makeTags(string input)
    {
        return System.Net.WebUtility.HtmlDecode(input);
    }
</msxsl:script>

<xsl:template match="/data">

    <h1>working</h1>

    <xsl:variable name="outputHTMLText">
        <xsl:value-of select="user:makeTags(output)" disable-output-escaping="yes" />
    </xsl:variable>

    <xsl:variable name="outputNodes" select="exslt:node-set($outputHTMLText)" />


        <xsl:copy-of select="$outputNodes"  />


</xsl:template>

<xsl:template match="test">
    <xsl:value-of select="*" />
</xsl:template>

1 个答案:

答案 0 :(得分:0)

在.NET和XslCompiledTransform中,您可以使用

<msxsl:script language="C#" implements-prefix="user">
    public XPathNavigator parse(string input)
    {
        using (StringReader sr = new StringReader(input))
        {
          return new XPathDocument(sr).CreateNavigator();
        }
    }
</msxsl:script>

将XML字符串解析为XPathNavigator,然后在XSLT中表示为(单个节点的)节点集,以将模板应用于例如。

<xsl:apply-templates select="user:parse(Output)/test"/>

这假设当您尝试输出您拥有的值时,您显示的转义只是xml或html输出方法的效果。

另见https://stackoverflow.com/a/39948619/252228