代码之家  ›  专栏  ›  技术社区  ›  rjray

列表测试中的元素

  •  5
  • rjray  · 技术社区  · 16 年前

    对于我正在编写的样式表(实际上是一组样式表,每个样式表生成不同的输出格式),我需要评估某个值是否存在于值列表中。在本例中,测试的值取自元素的属性。要对其进行测试的列表来自对样式表的调用,并被视为顶级 <xsl:param> (在我调用时在命令行中提供 xsltproc 或者与saxon等价的调用)。例如,输入值可以是:

    v0_01,v0_10,v0_99
    

    而每个属性值看起来都很像 这样的价值。(逗号是用来分隔值还是空格并不重要——我现在选择了逗号,因为我计划通过命令行开关将值传递给 XSLTP ,使用空格将需要引用参数,而且我很懒,不想键入额外的两个字符。)

    我要找的是类似于Perl的 grep 其中,我可以看到当前的值是否包含在列表中。它可以用子字符串测试来完成,但是这必须是聪明的,这样才不会得到假阳性。 v0_01 不应与包含 v0_011 )似乎xsl/xslt支持的唯一非标量数据类型是节点集。我认为可以将列表转换为一组文本节点,但这似乎是过度终止,甚至与使用额外的边界检查来防止错误匹配的子字符串测试相比也是如此。

    2 回复  |  直到 10 年前
        1
  •  8
  •   Tomalak    12 年前

    实际上,使用xpath字符串函数是正确的方法。您只需确保测试分隔符:

    contains(concat(',' $list, ','), concat(',', $value, ','))
    

    将返回布尔值。或者你可以使用其中一个:

    substring-before(concat('|,' $list, ',|'), concat(',', $value, ','))
    

    substring-after(concat('|,' $list, ',|'), concat(',', $value, ','))
    

    如果结果是空字符串, $value 不在列表中。

    编辑:

    @Dimitre的评论是正确的: substring-before() (或) substring-after() )如果找到的字符串是列表中的第一个(或最后一个),也将返回空字符串。为了避免,我补充说 某物 在列表的开头和结尾。仍然 contains() 是推荐的方法。

        2
  •  4
  •   Dimitre Novatchev    16 年前

    除了tomalak提供的xpath 1.0解决方案之外,

    使用xpath 2.0 人们可以将价值列表记数:

    exists(tokenize($list, ',')[. = $value])

    评估为 true() 如果且仅当 $value 包含在值列表中 $list