In the hope that this will prove useful to others, the code that I wrote after Michael Kayโs suggestion is given below. I wrote a custom compare
function that gives the same results as Xpath 2.0. I also added a php
tag to the question so that it is found more often.
<?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>
The result of doing this (with dummy input) is
<?xml version="1.0"?> <out> <test1>-1</test1> <test2>0</test2> <test3>1</test3> <test4>1</test4> </out>
For those who want to test this in php for themselves, here is the code I used:
<?php $xslt = new XSLTProcessor(); $xslt->importStylesheet( DOMDocument::load('testCompare.xslt') ); $xslt -> registerPHPFunctions(); $xml = new SimpleXMLElement('<test/>'); print $xslt->transformToXML( $xml ); ?>
source share