匹配和除表达之外
映射规则有一个匹配表达式,用于指定输入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和匹配祖先然后:
- @属性名+计算结果为true,如果E.包含具有名称的属性属性名那否则生产评估为FALSE。
- @属性名-计算结果为true,如果E.不包含名称的属性属性名那否则生产评估为FALSE。
- @属性名= ’属性值'计算结果为true,如果E.包含具有名称的属性属性名价值呢属性值,否则生产评估为FALSE。
- @属性名!= ‘属性值'计算结果为true,如果E.包含具有名称的属性属性名属性的值不相等属性值;否则产品的计算结果为false。
笔记:如果整个匹配表达式值的封闭报价是单引号,则C)和d)的attrvalue应该用双引号括起来。
我们现在准备说明输入XML文档中的元素可以触发激活映射规则的条件。
映射规则m比赛一个元素E.当满足以下三个条件时:
- 如果小姐匹配QName等于E.的元素名称;以及
- 如果m包含一个可选的匹配索引然后我E.必须是我TH.子类型在父类型的上下文中引用(1)。
- 如果m包含可选匹配祖先然后是前缀E.的祖先必须以相同的顺序与前缀中列出的祖先相等;以及
- 如果m包含可选匹配条件后缀,后缀必须根据符合trueE.的属性。
- 如果m的除了表达式确实如此不是匹配在前三个规则下。
笔记:当匹配表达式不包含匹配索引时,也会满足2,3和4,分别匹配祖先前缀或匹配条件后缀。
使用通配符:此外,匹配Qname或匹配祖先中的每个Qname都可以被通配符替换为匹配任何QName的通配符。通配符也可以在qname的前缀和/或本地名称中指定:*:local-name,或prefix:*,或*:*(与单个*相同)。
匹配表达式时m匹配元素E.在输入XML文档流中,我们还说映射规则R.包含m比赛E.. 也就是说,R.比赛E.。
例如,考虑以下输入XML文档片段:
<玩家性别=“女性”名称=“Laura”ID =“3453”位置=“防御”>1234 id> coach> 5678 id coach> 7889 id> manager> 播放器> <播放器性别=“男性”名称=“Juan”ID =“1234”位置=“转发”> 1234 id> coach> 5678 id> coach> 7889 id> manager> player> <播放器性别=“男性“名称=”lucas“id =”1234“> 1234 id> coach> 5678 id> coach> 7889 id> manager> 播放器>
以下映射规则与上述XML文档片段匹配各种元素:
<映射匹配=“播放器”> <! - 匹配所有播放器元素 - > mapping><! - 匹配第三播放器元素 - > mapping><映射匹配=“coach / id”> <! - 匹配具有父Coach元素的所有ID元素 - > mapping> <! - 匹配ID对于播放器的第二个子教练 - > mapping> <! - 匹配具有管理员父的所有ID元素 - > mapping>
<映射匹配=“/ *”> <! - 匹配根元素,只匹配根元素 - > mapping>