XSLT如何检查一个值是否包含在数组中?

3

我有一个模板,它只匹配包含值为101、103或104的<PRA.3>元素的PRA元素。我的输入如下:

<XML>
   <PRA>
      <PRA.3>101</PRA.3>
      <PRA.6>654</PRA.6>
   </PRA>
   <PRA>
      <!-- does not match -->
      <PRA.3>999</PRA.3>
      <PRA.6>654</PRA.6>
   </PRA>      
</XML>

工作正常的XSLT:

<xsl:template match="PRA[PRA.3='101' or PRA.3='103' or PRA.3='104']">
   <!-- does match if PRA.3 equals 101,103,104 -->
</xsl:template>

这样做很好,但是值101、103和104将出现在更多的模板中,并且可能会发生变化。

是否可以将这些值添加到列表中,然后进行包含判断? 这里有一个我想要使用的示例代码:

<MYARRAY>101,102,104</MYARRAY>
<xsl:template match="PRA[MYARRAY.contains(PRA.3/text())]">

</xsl:template>

我正在使用XSLT 2.0。我会看一下index-of()... - Philipp
<xsl:value-of select="index-of((101, 102, 104),101)"/> 返回1。但是我该如何在XSLT的开头将列表(101,102,104)放入一个变量中? - Philipp
1
@FiveO 当然可以在你的XSLT开头将列表放入变量中。;) <xsl:variable name="myArray" select="(101,102,104)" />。但是,在匹配表达式中无法使用变量。您需要在<xsl:if>中进行测试。 - Tomalak
好的,但是我仍然要比较“字符串”。如果它周围没有'',那么这个值是什么类型? - Philipp
('101,102,104') 将是一个包含一个字符串 '101,102,104' 的序列,('101','102','104') 将是一个包含 3 个字符串的序列,(101,102,104) 将是一个包含 3 个数字的序列。 - Tobias Klevenz
显示剩余10条评论
1个回答

4
在XSLT 2.0中,您想要做的事情实际上相当简单,不需要使用contains或index-of:
<xsl:variable name="myArray" select="('101','102','104')"/>

<xsl:template match="PRA[PRA.3=$myArray]">

</xsl:template>

这已经足够了。

除非有强制的隐式数字转换的非常好的理由,否则我仍然会将它们作为字符串进行比较。 - biziclop
@biziclop,我认为你是对的,我更新了我的答案。区别在于,如果您使用数字数组,则如果存在一个不是数字的PRE.3,此表达式将崩溃。对于字符串,它只会悄悄地失败...现在有一些情况,我宁愿让它崩溃,所以...这取决于用例。 - Tobias Klevenz
我相当确定在这两种情况下都会静默失败。根据规范,当模板匹配模式被评估时,所有错误都被认为是可恢复的,恢复操作只是没有匹配。 - biziclop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接