Как написать таблицу стилей XSL 1.0 с функцией node-set (), которая будет работать как в MSXML, так и в libxml

У меня есть таблица стилей XSLT 1.0, работающая с использованием процессора XSL, включенного в PHP (libxml). Я хочу, чтобы одна и та же таблица стилей работала на процессоре Microsoft XSL MSXML 6.0 (msxml6.dll), в идеале, чтобы одна и та же таблица стилей могла работать на любом процессоре.

К сожалению, на данный момент мне нужно иметь две таблицы стилей - по одной для каждого процессора.

Этот фрагмент вызывает функцию node-set () на процессоре PHP;

<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  extension-element-prefixes="exsl">
    <xsl:template match="root">
        <xsl:variable name="rtf">
            <a>hello</a><b>world</b>
        </xsl:variable>
        <xsl:variable name="ns" select="exsl:node-set($rtf)"/>
        <xsl:copy-of select="$ns/b"/>
    </xsl:template>
</xsl:transform>

Этот фрагмент вызывает функцию node-set () на процессоре Microsoft;

<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  extension-element-prefixes="msxsl">
    <xsl:template match="root">
        <xsl:variable name="rtf">
            <a>hello</a><b>world</b>
        </xsl:variable>
        <xsl:variable name="ns" select="msxsl:node-set($rtf)"/>
        <xsl:copy-of select="$ns/b"/>
    </xsl:template>
</xsl:transform>

Если входной документ был;

<root/>

Результатом обеих таблиц стилей будет:

<b>world</b>

Мне нужна единая таблица стилей, которая может работать без изменений на процессоре PHP и процессоре Microsoft.

Хотя моя настоящая таблица стилей составляет около 400 строк, а функция node-set () используется в четырех местах, я надеюсь, что приведенные выше примеры демонстрируют проблему.


person Nigel Alderton    schedule 06.06.2011    source источник


Ответы (1)


Проверено на libxml и msxsl, работает в обоих случаях.

С Уважением

Майк.

<xsl:transform version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  xmlns:func="http://exslt.org/functions"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  extension-element-prefixes="exsl func msxsl"
  >

    <func:function name="msxsl:node-set">
      <xsl:param name="node"/>
      <func:result select="exsl:node-set($node)"/>
    </func:function>

    <xsl:template match="root">
        <xsl:variable name="rtf">
            <a>hello</a><b>world</b>
        </xsl:variable>
        <xsl:variable name="ns" select="msxsl:node-set($rtf)"/>
        <xsl:copy-of select="$ns/b"/>
    </xsl:template>
</xsl:transform>
person Mike Chamberlain    schedule 10.12.2011