これが他の人にも役立つことを願って、MichaelKayの提案に従って私が書いたコードを以下に示します。compare
Xpath2.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 );
?>