我有一个使用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()函数在四个地方使用,但我希望上面的例子能够证明这个问题。
答案 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>