为了证明这对其他人也有用,下面是我根据迈克尔凯的建议写的代码。我写了一个自定义的compare
函数,它提供了与Xpath 2.0相同的结果。我还为该问题添加了php
标签,以便更频繁地找到它。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:func="http://exslt.org/functions"
xmlns:common="http://exslt.org/common"
xmlns:custom="urn:myCustomFunctions"
exclude-result-prefixes="func common custom"
extension-element-prefixes="func custom">
<xsl:output method="xml"/>
<func:function name="custom:compare">
<xsl:param name="string1"/>
<xsl:param name="string2"/>
<func:result>
<xsl:choose>
<xsl:when test="$string1 = $string2">0</xsl:when>
<xsl:otherwise>
<xsl:variable name="nodes">
<node><xsl:value-of select="$string1"/></node>
<node><xsl:value-of select="$string2"/></node>
</xsl:variable>
<xsl:for-each select="common:node-set($nodes)/*">
<xsl:sort select="."/>
<xsl:choose>
<xsl:when test="position()=1 and .=$string1">-1</xsl:when>
<xsl:when test="position()=1 and .=$string2">1</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</func:result>
</func:function>
<xsl:template match="/">
<out>
<test1><xsl:value-of select="custom:compare('A', 'B')"/></test1>
<test2><xsl:value-of select="custom:compare('A', 'A')"/></test2>
<test3><xsl:value-of select="custom:compare('C', 'B')"/></test3>
<test4><xsl:value-of select="custom:compare('DD', 'A')"/></test4>
</out>
</xsl:template>
</xsl:stylesheet>
运行这个(与虚拟输入)的结果是
<?xml version="1.0"?>
<out>
<test1>-1</test1>
<test2>0</test2>
<test3>1</test3>
<test4>1</test4>
</out>
对于那些谁愿意来测试这个在PHP自己,这是我使用的代码:
<?php
$xslt = new XSLTProcessor();
$xslt->importStylesheet(DOMDocument::load('testCompare.xslt'));
$xslt -> registerPHPFunctions();
$xml = new SimpleXMLElement('<test/>');
print $xslt->transformToXML($xml);
?>
谢谢迈克尔 - 不错的紧凑解决方案。至于XSLT 2.0,有什么让我反感 - 'libxslt'是 - 这是'php 5'使用的引擎,我无法改变它。也许在将来,我的托管服务商将使用一个使用XSLT 2.0引擎的PHP版本 - 如果有的话。当然,我真的很想在XSLT 2.0中做所有这些事情 - 实际上我是为了开发而做的,然后不得不重写所有内容。我认为,对于大量的XSLT开发人员来说,不移动到XSLT 2.0的原因是相同的。 – Maestro13
@ Maestro13:Zobra支持XPath 2.0并可作为PHP扩展使用,请参阅:http://www.ibm.com/developerworks/xml/library/x-zorba/index.html - 就PHP而言,您可以[注册PHP函数](http://php.net/manual/en/domxpath.registerphpfunctions.php)像'strcmp'用于你的xpath。 – hakre
@hakre谢谢你的信息 - 我会去检查我的托管服务提供商是否可以激活Zobra。是的,另一种方法是注册一个自定义php函数,并在xslt中使用它 - 在XSLT战斗中,我完全忘记了这一点。 – Maestro13