Ну, IE использует MSXML в качестве своего XSLT-процессора (я думаю, что IE 9 использует MSXML 6), тогда как Visual Studio использует XslCompiledTransform. API-интерфейсы, предоставляемые и используемые с MSXML и XslCompiledTransform, значительно различаются, поэтому не ожидайте, что код функции расширения, написанный для MSXML API, будет работать с XslCompiledTransform и .NET API. См. http://msdn.microsoft.com/en-us/library/wxaw5z5e.aspx о том, как типы XSLT / XPath отображаются на типы .NET при использовании функций расширения. В вашем случае вы передаете набор узлов и строку из XSLT, которая сопоставляется с XPathNodeIterator и строкой в .NET.
Вот быстрая попытка переписать вашу функцию расширения для .NET:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function test(nodeIterator, string)
{
nodeIterator.MoveNext();
return nodeIterator.Current.SelectSingleNode("breakfast" + string);
}
]]>
</msxsl:script>
<xsl:template match="/">
<HTML>
<BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
background-color:#EEEEEE">
<xsl:value-of select="user:test(., '-menu')"/>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
[править]
Упс, я упустил, что вы уже нашли код .NET сами и хотите знать, как писать код для обоих процессоров XSLT. Это сложно. Какова ваша целевая платформа и ваша цель, вы хотите написать XSLT для IE, но разрабатывать с VS? Или вам действительно нужно использовать одну и ту же таблицу стилей в IE и на платформе .NET?
Вот попытка написать одну функцию расширения для обоих типов процессоров:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:custom-scripts">
<msxsl:script language="JScript" implements-prefix="user">
<![CDATA[
function test(nodeSet, string)
{
if (typeof nodeSet.nextNode !== 'undefined') {
var node = nodeSet.nextNode();
return node.selectSingleNode('breakfast' + string);
}
else if (typeof nodeSet.MoveNext !== 'undefined') {
nodeSet.MoveNext();
return nodeSet.Current.SelectSingleNode("breakfast" + string);
}
}
]]>
</msxsl:script>
<xsl:template match="/">
<HTML>
<BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;
background-color:#EEEEEE">
<xsl:value-of select="user:test(., '-menu')"/>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>