C# XSLT 扩展函数如何 return 一个 XML 片段被用作未转义的 XML?

How can a C# XSLT extension function return an XML fragment that gets used as unescaped XML?

我编写了一个使用 C# 扩展函数的 XSLT。该函数 returns 一个 XML 片段。像这样:

public string MyFunc(string input)
{
  return "<thisIsXml/>";
}

我这样称呼它:

<value-of select="extensions:MyFunc(.)"/>

有效,但响应被转义了,所以最终结果如下:

&lt;thisIsXml&gt;

我不想要那个——我希望它作为 实际、未转义的 XML 注入。 可能吗?

(这是 C#,因此仅限 XSLT 1.0。)

解决方案似乎是 return 一个 XPathNavigator 对象,而不是一个字符串。您可以从片段中形成这些。我在我的扩展对象中写了这个效用函数:

private XPathNavigator GetFragment(string input)
{
  var settings = new XmlReaderSettings()
  {
    ConformanceLevel = ConformanceLevel.Fragment
  };

  var doc = new XPathDocument(XmlReader.Create(new StringReader(input), settings));
  return doc.CreateNavigator();
}

然后我在 return 之前通过该函数将我的扩展函数重写为 运行 它的字符串。

在 C# 中构造一个 System.Xml.XmlDocument 或 System.Xml.XPath.XPathDocument,并从该 XmlDocument 或 XPathDocument 构造一个 return 一个 XPathNavigator。当然,在 XSLT 中,您还需要 <xsl:copy-of select="extension:MyFunc(.)"/>.