我正在开发一个.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
之类的变量。然后,我想使用此功能在<title>
中查找属性<part>
中包含变量$partid
的{{1}}。
我最初使用以下内容执行此操作:
ids
但是,如果<xsl:value-of select="/video/part[contains(@ids, $partid)]/title"/>
类似$partid
,但pt1
元素<part>
ids
为pt12
,我现在意识到这会遇到问题以及<part>
元素以ids
为pt1
。因为这将匹配两者。
我以为我可以将它换成使用matches()
代替contains()
并使用这样的正则表达式:
matches(@ids, '(^'+$partId+' | '+$partId+' | '+$partId+'$ |^'+$partId+'$)')
然而,我似乎仅限于XSLT 1.0,它不允许matches()
。关于如何处理这个问题的任何想法?
非常感谢。
答案 0 :(得分:1)
XSLT 1.0中没有正则表达式支持。要消除pt1
和pt 12
之间的歧义,您可以执行以下操作:
<xsl:value-of select="/video/part[contains(concat(' ', @ids, ' '), concat(' ', $partid, ' '))]/title"/>
更好的解决方案将在您的上游:以这种方式使用XML毫无意义。