匹配和例外表达式

映射规则具有一个匹配表达式,该表达式指定输入XML文档流中的哪些元素可能触发它的激活。except表达式具有与match表达式完全相同的语法,但用于限制哪些元素触发映射规则激活。match表达式有一种机制,可以根据元素的:

  • 的名字
  • 的祖先,和/或
  • 属性名称和/或值。

匹配表达式在xfMap中,由< >映射元素的匹配属性。匹配表达式的值的语法是:

(/) (ancestorElement/) *元素({指数})?([booleanExpr])?

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

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

但是,如果发现前缀没有相应的XML Namespace声明,则在比较时将忽略该前缀,也就是说,只有元素的local-name才有意义。这是为了保持与支持XML名称空间之前编写的现有xfMaps的向后兼容性。

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

匹配QName可能后面跟着一个指数,一个正数,包含在“{”和“}”中。括在花括号内的数字称为匹配指数。它指示的不是位置,而是该特定元素在其父元素上下文中的计数。

匹配QName可以用布尔表达式作为后缀,booleanExpr,以E的属性。当存在时,布尔表达式必须用方括号括起来[].这个后缀叫做the符合条件

下面举例说明The的语法符合条件

booleanExpr = attrCondition |and dexpr |orExpr | ' (' booleanExpr ') ' and booleanExpr orExpr = booleanExpr ' or ' booleanExpr attrCondition = ' @ ' attrName(' = ' | ' != ')(' " ' |" ' ")attrValue(' " ' |" ' ")

注意:注意:XML Reader以正确的关联方式计算布尔表达式。对于复杂的布尔表达式,建议使用括号来指示求值的优先级。

符合条件是布尔表达式booleanExpr.一个布尔表达式可以是一个属性条件attrCondition,也可以是用括号括起来的逻辑连接的属性条件序列。价值符合条件则取决于布尔表达式中的各个属性条件。

从上面的语法,一个属性条件产生attrCondition可以用四种不同的方式指定;假设E元素是由匹配QName匹配的祖先然后:

  1. attrName+计算为trueE包含带有名称的属性attrName,否则,生产计算为false。
  2. attrName-计算为trueE不包含名称为attrName,否则,生产计算为false。
  3. attrName= 'attrValue计算为trueE包含带有名称的属性attrName和价值attrValue,否则计算结果为false。
  4. attrName! = 'attrValue计算为trueE包含带有名称的属性attrName这个属性的值不等于attrValue;否则,生产计算为false。

注意:如果整个匹配表达式值的外引号是一个单引号,那么c)和d)中的attrValue应该用双引号括起来。

现在,我们已经准备好声明输入XML文档中的元素触发映射规则激活的条件。

一个映射规则匹配一个元素E当满足以下三个条件时:

  1. 如果米的匹配QName=E的元素QName;和
  2. 如果包含一个可选的匹配指数我,然后E一定是Ith子类型指的是1)在其父上下文中。
  3. 如果包含可选的匹配的祖先前缀,然后E的祖先必须以相同的顺序与前缀中列出的祖先相同;和
  4. 如果包含可选的符合条件后缀,则后缀必须根据E的属性。
  5. 如果除了表达式是在前三条规则下匹配。

注意:当匹配表达式不包含匹配索引、匹配祖先前缀或匹配条件后缀时,也满足2、3和4。

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

当匹配表达式匹配一个元素E在输入XML文档流中,我们也称之为映射规则R包含匹配E.也就是说,R匹配E

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

<球员性别="女" name="Laura" id="3453" position="防守"> <教练> 1234  <教练> 5678  <教练> 7889  <球员性别="男" name="Juan" id="1234" position="forward"> <教练> 1234 <教练> 5678 <教练> 7889   1234   5678   7889  

下面的映射规则匹配上述XML文档片段中的各种元素:

<映射匹配= "玩家" > < !--匹配all player elements -->                            

<映射匹配= " / * " > < !--匹配the root element and only the root element -->