Встраивать 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" отработал отлично.