正则表达式:排除fn:matches中的子字符串

时间:2015-03-10 21:39:44

标签: regex xml xquery

我有一个配置xml为   

    <cfg:property name="Gallery.*.*">GalleryPort</cfg:property>
    <cfg:property name="Office.*.*">OfficePort</cfg:property>
    <cfg:property name="Home.Living.Closet$">LivingCloset</cfg:property>
    <cfg:property name="Home.Living.Lights$">LivingLights</cfg:property>

我使用xquery使用

获取属性的值
  

$ dynamicURN:= $ config // cfg:property [matches($ key,@ name)] / text()

从数据库收到$ key,并且获取了urn。 应该是第四个属性名称,以便它可以捕获除了Closet或者Home.Living之后的任何字符串。?

示例:我试过

<cfg:property name=" Home.Living.[A-Z-[LIGHTS]]">LivingMisc</cfg:property>

<cfg:property name=" Home.Living.[^'(LIGHTS)']">LivingMisc</cfg:property>

密钥的可能值为:

Home.Living.Lights
Home.Living.Light
Home.Living.Closed
Home.Living.Closet
Home.Living.Table

相应的输出应为

LivingLights
LivingMisc
LivingMisc
LivingCloset
LivingMisc

1 个答案:

答案 0 :(得分:0)

下面的代码可以为您提供所需的信息,但您可以通过另一种方式实现这一目标,即大规模实施更多功能。只是这样您就知道将对它找到的每个项目评估正则表达式。因此,对于每个节点,它会发现它将是3个表达式。

declare namespace cfg = "somthinghere";

let $key := ("Home.Living.Lights","Home.Living.Closet","Home.Living.anyOtherString","Home.Living.anotherString")[1]

let $config :=
<config>
  <cfg:property name="Gallery.*.*">GalleryPort</cfg:property>
  <cfg:property name="Office.*.*">OfficePort</cfg:property>
  <cfg:property name="Home.Living.Closet$">LivingCloset</cfg:property>
  <cfg:property name="Home.Living.Lights$">LivingLights</cfg:property>
  <cfg:property name="Home.Living.[^Closet|Lights]">LivingMisc</cfg:property>
</config>
let $option := $config//cfg:property[fn:matches($key, @name )]/text()
return $option

<强>更新

由于你不能在xquery中使用负向前瞻,你可以尝试这样的事情。不要将Name用于其他home.living。火柴。所以这里的代码首先会看@name。如果它找到了它会停止的东西。如果它没有找到某些东西,那么它会查看@fallback并匹配它。

这只是意味着在第一场比赛中找不到的关键点将会运行第二场比赛,因此它只是更多的表达式。

declare namespace cfg = "somthinghere";

let $key := (
  "Home.Living.Lights",
  "Home.Living.Closet",
  "Home.Living.anyOtherString",
  "Home.Living.anotherString",
  "Home.Living.Close",
  "Gallery"
)[2]

let $config :=
<config>
  <cfg:property name="Gallery.*.*">GalleryPort</cfg:property>
  <cfg:property name="Office.*.*">OfficePort</cfg:property>
  <cfg:property name="Home.Living.Closet$">LivingCloset</cfg:property>
  <cfg:property name="Home.Living.Lights$">LivingLights</cfg:property>
  <cfg:property fallback="Home.Living.*">LivingMisc</cfg:property>
</config>
return ($config//cfg:property[fn:matches($key, @name )]/text()[1], $config//cfg:property[fn:matches($key, @fallback )]/text()[1])[1]