与key()的XSLT 2.0不区分大小写的匹配

时间:2016-04-22 04:55:24

标签: xml xslt

我正在检查XML文件中@id属性中是否存在字符串。我不关心这种情况,只是字符串的字母匹配。因此"myid_5"可以等于"mYiD_5""MYID_5"等等。我正在使用<xsl:key>key(),显然我不能使用带有键的lower-case()函数来规范化密钥找到的@id。我可以吗?或类似的东西?

XML文件示例(下面为$lookup-file):

 <root>
   <p id="A41_YrlyDedHdr">Blah</p>
   <p id="A42_YrlyDed15">Blah</p>
 </root>

$lookup-file的关键:

<xsl:key name="p-id" match="/root/p" use="@id"/>

模板:

<xsl:template match="fig">
  <xsl:variable name="id" select="lower-case(@id)"/>
  <xsl:choose>
    <!-- ?? Can force to lowercase below?? -->
    <xsl:when test="exists(key('p-id', $id, $lookup-file))">
      <!-- do something with <fig> -->
    </xsl:when>
    <xsl:otherwise/>
  </xsl:choose>
</xsl:template>

似乎键上的排序规则可能会使其不区分大小写,但我不知道要使用哪种排序规则。

1 个答案:

答案 0 :(得分:1)

  

显然我不能使用带有键的小写()函数

为什么不呢?您可以将密钥定义为:

<xsl:key name="p-id" match="/root/p" use="lower-case(@id)"/>

然后将其用作:

<xsl:when test="exists(key('p-id', lower-case(@id), $lookup-file))">
  

似乎键上的排序规则可能会使其不区分大小写

这是一个有趣的想法,但我相信实现将依赖于处理器。所以在撒克逊你可以做到:

<xsl:key name="p-id" match="/root/p" use="@id" collation="http://saxon.sf.net/collation?ignore-case=yes"/>

http://www.saxonica.com/documentation/index.html#!extensibility/config-extend/collation/implementing-collation