Как использовать C# в XSLT

Встраивать C# в XSLT не очень полезно с точки зрения разделения логики и представления, но жизнь диктует свои условия и иногда требуется сложная логика в XSLT.

Рассмотрим простой пример:

XML над которой мы будем производить преобразования:

<?xml version="1.0" encoding="utf-8"?>
<a name="a-name">
  <b name="b-name"/>
</a>

Виновник торжества: XSLT с C# кодом

<?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" exclude-result-prefixes="msxsl"
    xmlns:hw="mysite"
>
  <xsl:output method="text" indent="no"/>
  <msxsl:script xmlns:msxsl="urn:schemas-microsoft-com:xslt" language="C#" implements-prefix="hw">
    <![CDATA[
    public string HelloText(string value)
    {
        return string.Format("text:Hello {0}!\n", value);
    }
    
    public string HelloNode(XPathNavigator node)
    {
        return string.Format("node:Hello {0}!\n", node.GetAttribute("name", ""));
    }
]]>
  </msxsl:script>  
    <xsl:template match="/">
      <xsl:value-of select="hw:HelloText(//a/@name)"/>
      <xsl:value-of select="hw:HelloNode(//b)"/>
    </xsl:template>
</xsl:stylesheet>

Данный пример содержить 2 функции: одна принимает строковое значение, вторая же принимает XPathNavigator.

Результатом работы XSLT будет следующий текст:
text:Hello a-name!
node:Hello b-name!

"Helloworld" отработал отлично.