Объекты расширения могут использоваться для повышения производительности, если часть преобразования XSLT считается неэффективной.
Хотя использование методов метода расширения не приведет к снижению производительности (исключая ошибочный и неэффективный код), * 1007 * они не улучшат производительность значительно, если для доступа к локализованным строкам используются надлежащие методы XSLT .
В случае, если объекты расширения не являются остро необходимыми, всегда полезно создать чистое решение XSLT. Это обеспечивает дополнительное преимущество переносимости для любой платформы, которая обеспечивает совместимый процессор XSLT .
Можно поместить все локализованные строки для данного языка в отдельный файл XML. Этот файл будет доступен с помощью функции XSLT document()
. Каждая строка будет проиндексирована своим атрибутом @msgId
, используя построение индекса по инструкции <xsl:key>
. В рамках преобразования будет получено отдельное сообщение с функцией XSLT key()
.
Ниже приведен небольшой пример кода, показывающий, как извлечь сообщение с помощью msgId и Languge-code из файла 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.