AddExtensionObject - Производительность - PullRequest
2 голосов
/ 26 декабря 2008

.NET XSLT engine позволяет передавать объекты в обработчик XSLT с помощью метода AddExtensionObject.

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

Ответы [ 2 ]

6 голосов
/ 27 декабря 2008

Объекты расширения могут использоваться для повышения производительности, если часть преобразования 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.

2 голосов
/ 26 декабря 2008

Если честно, я бы об этом не беспокоился - должно быть больше , чем достаточно. Я использую объект расширения для таких вещей, как regex-replace и других сложных манипуляций со строками (не всегда просто в xslt), и это работает.

Если вы делаете только несколько глобальных строк, то вы также можете использовать параметры уровня шаблона (а не расширение); но если у вас есть много объектов для поиска (или они динамические), тогда объект расширения имеет смысл.

Если возможно, используйте XslCompiledTransform, что повысит производительность (и, конечно, метод C # в методе расширения превзойдет метод <script> в xslt). Кроме этого, если у вас узкое место, это, скорее всего, такие вещи, как неправильное использование xsl-индексов, группировка по Мюнхену и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...