我需要匹配一组XML文档上的模式(所有模式都相同),当模式匹配时,我需要检索内容并对其进行一些特定的转换。
我有一个“模式”列表,它们与正则表达式类似,但具有元素和属性。
伪模式示例:
(//ELEMENTx) (node())* (//ELEMENTy[@ATTRIBUTEz]) (node())* (//@ATTRIBUTEw)
我只在括号内使用了XPath语法。可以使用其他量词......
当xml将ELEMENTx作为第一个元素,以一个具有ATTRIBUTEw的元素结束,并且在它们之间需要具有带ATTRIBUTEz的ELEMENTy时,这将匹配。
请注意,我需要为整个模式匹配整个文档,而不仅仅是其中的一部分。
在这种情况下,元素的嵌套无关紧要(ELEMENTy可能是ELEMENTx的子元素,或者不是),但它们需要具有特定的顺序。
编辑: 为了澄清,XML具有包含语法信息的树。我需要匹配句法模式。
示例:
TOP / \ X Y |\ |\ 1 2 3 4
匹配模式可以是(节点名称,假设没有属性):
X Y
1 * Y
X 3 4
1 * 4
我可以使用XPath来获取模式的每个部分,但后来我失去了秩序感......如果我做两个XPath查询,我不知道结果相对于彼此的位置。 / p>
匹配后,我将为每个模式制定规则,指定对内容的一些转换(变更单等)。
有没有办法使用XPath或XQuery做这样的事情? 我可以使用DOM并自己制作模式匹配代码,但也许有更好的方法来做到这一点。
感谢您的任何指示。
答案 0 :(得分:1)
我需要匹配一组XML文档上的模式(所有模式都相同),当模式匹配时,我需要检索内容并对其进行一些特定的转换。
到目前为止,这听起来像是一个非常好的XSLT描述。直到你说你想要一个规则匹配一系列节点,而不是一个节点。
但是如果您匹配的节点序列是某个父节点的子节点序列,那么您可以将其重新设置为匹配父节点的规则。
XSLT中的模式匹配语言并不像您正在寻找的那样强大,但它可能可以根据您的需要进行调整。想到的两种可能性是(a)将您想要匹配的结构信息转换为字符串,并使用正则表达式匹配来评估字符串,或者(b)为您想要的语法编写XSD复杂类型定义匹配,并使用XSLT validate-by-type功能(与XSLT 3.0的try / catch结合使用)来测试节点序列是否与模式中的命名复杂类型匹配。