Regex XSLT问题:属性值的正则表达式
考虑以下XML:Regex XSLT问题:属性值的正则表达式,regex,xml,xslt,Regex,Xml,Xslt,考虑以下XML: <?xml-stylesheet type="text/xsl" href="eclas.xsl"?> <collection> <record> <datafield tag="150"> <subfield code="a">Abandon des études</subfield><!--accepted FR--> <sub
<?xml-stylesheet type="text/xsl" href="eclas.xsl"?>
<collection>
<record>
<datafield tag="150">
<subfield code="a">Abandon des études</subfield><!--accepted FR-->
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="150">
<subfield code="a">Student drop-out</subfield><!--accepted EN-->
<subfield code="9">eng</subfield>
</datafield>
<datafield tag="450">
<subfield code="a">Décrochage scolaire</subfield><!-- NOT accepted term FR-->
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="450">
<subfield code="a">Abandon scolaire</subfield><!-- NOT accepted term FR-->
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="450">
<subfield code="a">Abandon de la scolarité</subfield><!-- NOT preferred term FR-->
<subfield code="9">fre</subfield>
</datafield>
</record>
<record>
<datafield tag="151">
<subfield code="a">Egypte</subfield>
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="151">
<subfield code="a">Egypt</subfield>
<subfield code="9">eng</subfield>
</datafield>
<datafield tag="451">
<subfield code="a">République arabe d'Egypte</subfield>
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="451">
<subfield code="a">République arabe unie</subfield>
<subfield code="9">fre</subfield>
</datafield>
<datafield tag="451">
<subfield code="a">United Arab Republic</subfield>
<subfield code="9">eng</subfield>
</datafield>
</record>
</collection>
这是一本大型同义词表的样本。
我需要有关正则表达式的帮助,该正则表达式可以选择150或151,也可以选择450或451
以下是我遇到问题的xslt代码:
<xsl:for-each select="datafield[contains(@tag, '150|151' )]">
...
</xsl:for-each>
我试图循环使用值为150或151的数据字段元素。
我的正则表达式似乎不起作用。我尝试了几种方法,但都没有效果。contains将字符串而不是正则表达式作为第二个参数,因此您的代码正在查找字符串150 | 151。在XSLT1.0中不能使用正则表达式。但是,使用choose函数可以执行多个包含。有关更多信息,请参见问题。contains函数没有将正则表达式作为第二个参数,只是检查一个简单字符串是否在第一个字符串中。你应该使用匹配项
同样,额外使用|是为了防止拾取1500个字符串,例如。要匹配以下4个字符串之一: 150、151、450和451。请注意: 第一个字符是1或4, 第二个字符总是5, 最后一个字符是0或1。 因此,匹配所有这些参数的正则表达式是^[14]5[01]$ 我放置了^和$anchors以防止匹配这样的字符串 作为较长文本的一部分,例如31508 因此,在XSLT 2.0中,您可以编写:
<xsl:for-each select="datafield[matches(@tag, '^[14]5[01]$')]">
编辑XSLT->XSLT1.0。当然,您可以使用最新版本的语言进行正则表达式处理。对于XSLT问题,说出您使用的语言版本非常重要。
<xsl:for-each select="datafield[matches(@tag, '^(150|151)$')]">
<xsl:for-each select="datafield[contains('|150|151|', concat('|', @tag, '|') )]">
<xsl:for-each select="datafield[matches(@tag, '^[14]5[01]$')]">