Расширения

MSXML поддерживает пользовательские функции расширения, которые могут быть написаны на скриптовых языках VBScript и JScript и включены непосредственно в сами преобразования.

Пример П1.3. Входящий документ

<?xml version="1.0" encoding="windows-1251"?>
<page>Сегодня <date/>.</page>

Пример П1.4. Преобразование

<xsl:stylesheet
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:ext="urn:extension-functions"
  exclude-result-prefixes="msxsl ext">

  <xsl:output encoding="windows-1251"/>

  <msxsl:script
    language="JavaScript"
    implements-prefix="ext">
    function date()
    {  
       now = new Date;
       return now.getDate() + '.' + 
             (now.getMonth() + 1) + '.' + 
             now.getYear();
    }
  </msxsl:script>

  <xsl:template match="/">
    <html>
      <head>
        <title>Today is page</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="date">
    <xsl:value-of select="ext:date()"/>
  </xsl:template>

</xsl:stylesheet>

Пример П1.5. Выходящий документ

<html>
  <head>
    <META
      http-equiv="Content-Type"
      content="text/html; charset=windows-1251">
      <title>Today is page</title>
    </head>
  <body>Сегодня 18.10.2001.</body>
</html>

Как и во многих других процессорах, в MSXML предусмотрена функция расширения node-set, которая преобразует результирующий фрагмент дерева во множество узлов. Функция node-set принадлежит пространству имён с URI «urn:schemas-microsoft-com:xslt» и стандартным сценарием её использования будет примерно следующий:

<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 ">

  <!-- ... -->

  <xsl:variable name="tree">
    <!-- Переменная, содержащая результирующий фрагмент дерева -->
    <item>A</item>
    <item>B</item>
  </xsl:variable>

  <!-- ...-->

  <xsl:template ... >
    <!-- Обращение к $tree, как ко множеству узлов -->
    <xsl:value-of select="msxsl:node-set($tree)/item[1]"/>
  </xsl:template>

</xsl:stylesheet>

К сожалению, текущая версия MSXML не поддерживает расширение пользовательскими элементами.