我正在研究一个.NET项目,该项目使用XSLT将xml文件转换为不同的格式。
我有这样的原始 xml(这只是相关部分(:
<video>
<part ids="pt1">
<title>Title1</title>
</part>
<part ids="pt2 pt3">
<title>Title2</title>
</part>
<part ids="pt4">
<title>Title3</title>
</part>
</video>
在我的 xslt 文件中,我有一个变量$partid
它被设置为类似于 pt2
.然后我想使用它来查找包含属性ids
中的变量$partid
的<part>
中的<title>
。
我最初是用以下内容来执行此操作的:
<xsl:value-of select="/video/part[contains(@ids, $partid)]/title"/>
但是,我现在意识到,如果$partid
类似于pt1
,但存在一个<part>
元素,ids
作为pt12
,以及一个ids
pt1
的<part>
元素,这会遇到问题。因为这将匹配两者。
我想我可以交换它以使用 matches()
而不是 contains()
并使用如下所示的正则表达式:
matches(@ids, '(^'+$partId+' | '+$partId+' | '+$partId+'$ |^'+$partId+'$)')
但是,我似乎仅限于不允许matches()
的 XSLT 1.0 .关于我如何进行这项工作的任何想法?
非常感谢。
XSLT 1.0 中没有正则表达式支持。要消除 pt1
和 pt 12
之间的歧义,您可以执行以下操作:
<xsl:value-of select="/video/part[contains(concat(' ', @ids, ' '), concat(' ', $partid, ' '))]/title"/>
更好的解决方案是上游:以这种方式使用 XML 真的没有什么意义。