如果我正确理解您的要求,则@country
始终存在,因此我们可以对该属性进行基于键的查找。对于其他两个属性@areacode
,@division
您希望使用code
两个属性都与优先级匹配的 a code
,其中一个匹配属性的优先级高于code
没有匹配属性的 a。
所以我会简单地创建一系列不同的优先级并找到第一个:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="lkp-url" select="'test2013062402.xml'"/>
<xsl:variable name="lkp-doc" select="doc($lkp-url)"/>
<xsl:key name="by-country"
match="code"
use="@country"/>
<xsl:param name="c" select="'ca'"/>
<xsl:param name="ac" select="'222'"/>
<xsl:param name="d" select="'46'"/>
<xsl:template match="/">
<xsl:value-of select="(key('by-country', $c, $lkp-doc)[@areacode = $ac and @division = $d],
key('by-country', $c, $lkp-doc)[not(@areacode) and @division = $d],
key('by-country', $c, $lkp-doc)[@areacode = $ac and not(@division)],
key('by-country', $c, $lkp-doc)[not(@areacode) and not(@division)])[1]/@id"/>
</xsl:template>
</xsl:stylesheet>
我不知道这两个属性中的哪一个具有优先级,如果具有优先级,您可能希望将我在代码中创建的序列中的第二项和第三项areacode
打乱。
上述代码应缩短为
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="lkp-url" select="'test2013062402.xml'"/>
<xsl:variable name="lkp-doc" select="doc($lkp-url)"/>
<xsl:key name="by-country"
match="code"
use="@country"/>
<xsl:param name="c" select="'ca'"/>
<xsl:param name="ac" select="'222'"/>
<xsl:param name="d" select="'46'"/>
<xsl:template match="/">
<xsl:variable name="cs" select="key('by-country', $c, $lkp-doc)"/>
<xsl:value-of select="($cs[@areacode = $ac and @division = $d],
$cs[not(@areacode) and @division = $d],
$cs[@areacode = $ac and not(@division)],
$cs[not(@areacode) and not(@division)])[1]/@id"/>
</xsl:template>
</xsl:stylesheet>