匹配和除表达之外

映射规则有一个匹配表达式,用于指定输入XML文档流中的哪些元素可以触发其激活。except表达式的语法与match表达式完全相同,但用于限制触发映射规则激活的元素。匹配表达式具有基于元素的以下属性标识所需元素的机制:

  • 姓名
  • 祖先和/或
  • 属性名称和/或值。

匹配表达式在xfMap中,由元素比赛属性。匹配表达式值的语法是:

(/)(安塞素/)*元素({指数})?([Booleanexpr.])?

在哪里元素指定元素的QnameE.在输入文档流中。E.被称为匹配QName

笔记:注意:以来元素指定Qname QName的前缀必须绑定到特定的URI。XFMAP中的所有XML命名空间声明必须出现在XFMAP文档的根目录中,即在元素中。

但是如果发现前缀不具有相应的XML命名空间声明,则将在比较中忽略前缀,即,即,只有元素的本地名称变得显着。这是为了在支持XML命名空间之前向后兼容现有的XFMAP。

匹配QName可以选择以其祖先元素的QName作为前缀安塞素每个祖先QName用正斜杠(/)分隔。这个前缀叫做匹配祖先. 在匹配表达式的开头使用正斜杠(/)将导致表达式在根位置锚定时匹配。

匹配QName可能是一个指数,一个正数,括在'{'和'}'中。括在卷绕括号内的数字被称为匹配索引。它所指示的匹配索引,不是位置,而是该特定元素在其父元素上下文中的计数。

匹配QName可以用布尔表达式作为后缀,Booleanexpr.,计算时间E.的属性。存在时,布尔表达式必须用方括号括起来[]. 这个后缀称为匹配条件

下面说明了匹配条件

booleanExpr=attrCondition | andExpr | orExpr |'('booleanExpr')'andExpr=booleanExpr'和'booleanExpr orExpr=booleanExpr'或'booleanExpr attrCondition='@'attrName('+'|'-')|'@'attrName('='|')!=')('“|”'”)属性值('“|”'”)

笔记:注意:XML读取器以正确的关联方式评估布尔表达式。对于复杂的布尔表达式,建议使用括号来指示评估的预期优先级。

匹配条件是一个布尔表达式Booleanexpr.。布尔表达式可以是单个属性条件attrconitition.,或者它可以是一系列括号逻辑连接的属性条件。价值匹配条件然后取决于布尔表达式中的各个属性条件。

从上面的语法,属性条件制作attrconitition.可以用四种不同的方式指定;假设E.匹配QName匹配祖先然后:

  1. @属性名+计算结果为true,如果E.包含具有名称的属性属性名否则生产评估为FALSE。
  2. @属性名-计算结果为true,如果E.不包含名称的属性属性名否则生产评估为FALSE。
  3. @属性名= ’属性值'计算结果为true,如果E.包含具有名称的属性属性名价值呢属性值,否则生产评估为FALSE。
  4. @属性名!= ‘属性值'计算结果为true,如果E.包含具有名称的属性属性名属性的值不相等属性值;否则产品的计算结果为false。

笔记:如果整个匹配表达式值的封闭报价是单引号,则C)和d)的attrvalue应该用双引号括起来。

我们现在准备说明输入XML文档中的元素可以触发激活映射规则的条件。

映射规则m比赛一个元素E.当满足以下三个条件时:

  1. 如果小姐匹配QName等于E.的元素名称;以及
  2. 如果m包含一个可选的匹配索引然后我E.必须是我TH.子类型在父类型的上下文中引用(1)。
  3. 如果m包含可选匹配祖先然后是前缀E.的祖先必须以相同的顺序与前缀中列出的祖先相等;以及
  4. 如果m包含可选匹配条件后缀,后缀必须根据符合trueE.的属性。
  5. 如果m除了表达式确实如此不是匹配在前三个规则下。

笔记:当匹配表达式不包含匹配索引时,也会满足2,3和4,分别匹配祖先前缀或匹配条件后缀。

使用通配符:此外,匹配Qname或匹配祖先中的每个Qname都可以被通配符替换为匹配任何QName的通配符。通配符也可以在qname的前缀和/或本地名称中指定:*:local-name,或prefix:*,或*:*(与单个*相同)。

匹配表达式时m匹配元素E.在输入XML文档流中,我们还说映射规则R.包含m比赛E.. 也就是说,R.比赛E.

例如,考虑以下输入XML文档片段:

<玩家性别=“女性”名称=“Laura”ID =“3453”位置=“防御”>   1234     5678    7889    <播放器性别=“男性”名称=“Juan”ID =“1234”位置=“转发”>   1234     5678     7889    <播放器性别=“男性“名称=”lucas“id =”1234“>   1234     5678     7889   

以下映射规则与上述XML文档片段匹配各种元素:

<映射匹配=“播放器”> <! - 匹配所有播放器元素 - >   <! - 匹配第三播放器元素 - > <映射匹配=“coach / id”> <! - 匹配具有父Coach元素的所有ID元素 - >   <! - 匹配ID对于播放器的第二个子教练 - >   <! - 匹配具有管理员父的所有ID元素 - >                

<映射匹配=“/ *”> <! - 匹配根元素,只匹配根元素 - >