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

У меня есть таблица стилей 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 () используется в четырех местах, я надеюсь, что приведенные выше примеры демонстрируют проблему.

1 Ответ

2 голосов
/ 11 декабря 2011

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

С уважением

Mike.

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