xslt - 列表中的元素测试

标签 xslt

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

v0_01,v0_10,v0_99

而每个属性值看起来都非常像一个这样的值。 (是否使用逗号分隔值或空格并不重要 - 我现在选择逗号是因为我计划通过命令行开关将值传递到 xsltproc ,并且使用空格需要引用论点,而且我很懒,不想输入额外的两个字符。)

我正在寻找类似于 Perl 的 grep 的东西,其中我可以查看我当前拥有的值是否包含在列表中。可以通过子字符串测试来完成,但这必须很聪明,以免出现误报( v0_01 不应与包含 v0_011 的字符串匹配)。似乎 XSL/XSLT 支持的唯一非标量数据类型是节点集。我认为可以将列表转换为一组文本节点,但这似乎有些过头了,即使与使用额外边界检查来防止错误匹配进行子字符串测试相比也是如此。

最佳答案

实际上,使用 XPath 字符串函数是正确的方法。您必须确保也测试分隔符:

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

将返回一个 bool 值。或者您可以使用其中之一:

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

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

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

编辑:

@Dimitre 的评论是正确的:如果找到的字符串是第一个字符串,substring-before() (或 substring-after())也会返回空字符串(或列表中的最后一个)。为了避免这种情况,我在列表的开头和结尾添加了一些东西。 contains() 仍然是执行此操作的推荐方法。

关于xslt - 列表中的元素测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356039/

相关文章:

xml - 在 XSLT 1.0 中使用带有分隔符的 concat()

xml - 使用 XSLT 访问 XML

xml - 不匹配的子元素也出现在 XSL 模板下

xml - 在 XPath 谓词中使用祖先轴的问题

xslt - 如何在xsl中引用变量:text element?

xslt - 如何在 xslt 元素上应用分组依据

html - 在两个同样具有特定属性的 <li> 元素之间选择具有特定属性值的 <li> 元素

css - xslt 中的样式标签未呈现

javascript - Grunt - 通过 glob 获取文件名并稍后将其用作变量

xml - XSLT if - 属性等于字符串