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

时间:2011-06-06 12:58:40

标签: msxml xslt-1.0 libxml2

我有一个使用PHP附带的XSL处理器(libxml)运行的XSLT 1.0样式表。我希望在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>

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

<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 个答案:

答案 0 :(得分:2)

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