Механизм .NET XSLT позволяет передавать объекты механизму обработки XSLT через метод AddExtensionObject.
Может ли кто-нибудь прокомментировать эффективность использования этого для получения локализованных строк, которые будут использоваться в XSLT?





Если честно, я бы не стал об этом беспокоиться - более должно быть больше, чем достаточно. Я использую объект расширения, чтобы делать такие вещи, как замена регулярных выражений и другие сложные манипуляции со строками (не всегда просто в xslt), и это работает.
Если вы выполняете только несколько глобальных строк, вы также можете использовать параметры уровня шаблона (а не расширение); но если вам нужно много чего искать (или они динамические), то объект расширения имеет смысл.
Если возможно, используйте XslCompiledTransform, который будут повышает производительность (и, конечно, метод C# в методе расширения будет превосходить метод <script> в xslt). Помимо этого, если у вас есть узкое место, это, скорее всего, такие вещи, как неправильное использование xsl-индексов, группировка по Мюнчи и т. д.
Объекты расширения можно использовать для повышения производительности, если часть преобразования XSLT считается неэффективной.
Хотя использование методов метода расширения не приведет к снижению производительности (за исключением ошибочного и неэффективного кода), они не улучшат производительность значительно, если для доступа к локализованным строкам используются правильные методы XSLT..
Если в объектах расширения нет крайней необходимости, всегда полезно создать чистое XSLT-решение. Это обеспечивает дополнительное преимущество переносимости на любую платформу, которая предоставляет совместимый процессор XSLT..
Можно поместить все локализованные строки для данного языка в отдельный XML-файл. Доступ к этому файлу будет осуществляться с помощью функции XSLT document(). Каждая строка будет проиндексирована своим атрибутом @msgId с использованием построения индекса с помощью инструкции <xsl:key>. В рамках преобразования будет получено отдельное сообщение с помощью функции XSLT key().
Ниже приведен небольшой пример кода, показывающий, как получить сообщение по msgId и языковому коду из файла xml, в котором хранятся сообщения для всех языков. Для удобства мы поместили сообщения внутри самой таблицы стилей XSLT. На практике сообщения могут быть в отдельном XML-файле:
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "text"/>
<xsl:key name = "kMsgByLangAndId" match = "msg"
use = "concat(../@name, @msgId)"/>
<xsl:param name = "pLang" select = "'De'"/>
<xsl:param name = "pTime" select = "19"/>
<xsl:variable name = "vMsgEn">
<msg msgId = "MornGreet">Good morning.</msg>
<msg msgId = "AftnGreet">Good afternoon.</msg>
<msg msgId = "EvnGreet">Good evening.</msg>
</xsl:variable>
<xsl:variable name = "vMsgDe">
<msg msgId = "MornGreet">Guten morgen.</msg>
<msg msgId = "AftnGreet">Guten tag.</msg>
<msg msgId = "EvnGreet">Guten abend.</msg>
</xsl:variable>
<xsl:template match = "/">
<xsl:variable name = "vLangVarName"
select = "concat('vMsg', $pLang)"/>
<xsl:variable name = "vMsgId">
<xsl:choose>
<xsl:when test = "not($pTime >= 12)">MornGreet</xsl:when>
<xsl:when test = "not($pTime >= 18)">AftnGreet</xsl:when>
<xsl:otherwise>EvnGreet</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:for-each select = "document('')">
<xsl:value-of select=
"key('kMsgByLangAndId',
concat($vLangVarName,$vMsgId)
)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к любому исходному XML-документу (игнорируется), получается желаемый результат:
Guten abend.