如何使用node-set()函数编写XSL 1.0样式表,该函数将同时在MSXML和libxml上运行

如何使用node-set()函数编写XSL 1.0样式表,该函数将同时在MSXML和libxml上运行,msxml,xslt-1.0,libxml2,Msxml,Xslt 1.0,Libxml2,我有一个XSLT1.0样式表,它使用PHP(libxml)附带的XSL处理器运行。我希望在Microsoft XSL处理器MSXML 6.0(msxml6.dll)上运行相同的样式表,理想情况下,使相同的样式表可以在任何一个处理器上运行 不幸的是,目前我需要两个样式表——每个处理器一个 此代码段调用PHP处理器上的node-set()函数 <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transfo

我有一个XSLT1.0样式表,它使用PHP(libxml)附带的XSL处理器运行。我希望在Microsoft XSL处理器MSXML 6.0(msxml6.dll)上运行相同的样式表,理想情况下,使相同的样式表可以在任何一个处理器上运行

不幸的是,目前我需要两个样式表——每个处理器一个

此代码段调用PHP处理器上的node-set()函数

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

地狱世界
此代码段调用Microsoft处理器上的node-set()函数

<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>
<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()函数在四个位置使用,但我希望上面的示例能够说明问题。

在libxml和msxsl上检查,在这两种情况下都有效

问候

迈克


地狱世界