1

我需要匹配一组 XML 文档(都具有相同的模式)上的模式,当模式匹配时,我需要检索内容并对其进行一些特定的转换。

我有一个“模式”列表,它们类似于正则表达式,但包含元素和属性。

伪模式示例:

(//ELEMENTx) (node())* (//ELEMENTy[@ATTRIBUTEz]) (node())* (//@ATTRIBUTEw)

我只在括号内使用了 XPath 语法。可以使用其他量词...

当 xml 将 ELEMENTx 作为第一个元素,以一个具有 ATTRIBUTEw 的元素结束,并且在两者之间需要一个具有 ATTRIBUTEz 的 ELEMENTy 时,这将匹配。

请注意,我需要为每个完整模式匹配整个文档,而不仅仅是其中的一部分。

在这种情况下,元素的嵌套并不重要(ELEMENTy 可以是 ELEMENTx 的子代,也可以不是),但它们需要具有特定的顺序。

编辑:澄清一下,XML 有带有语法信息的树。我需要匹配句法模式。

例子:

 
     最佳  
     / \  
    XY  
    |\ |\  
    1 2 3 4  

匹配模式可以是(节点名称,假设没有属性):
XY
1 * Y
X 3 4
1 * 4


我可以使用 XPath 来获取模式的每个单独部分,但是我会失去秩序感……如果我执行两个 XPath 查询,我不知道结果相对于彼此的位置。

匹配后,我将为每个模式制定规则,指定内容的一些转换(更改顺序等)。

有没有办法使用 XPath 或 XQuery 做这样的事情?我可以使用 DOM 并自己制作模式匹配代码,但也许已经有更好的方法来做到这一点。

感谢您的任何指示。

4

1 回答 1

1

I need to match patterns on a set of XML documents (all with the same schema), and when a pattern matches, I need to retrieve the content and do some specific transformations on it.

So far that sounds like a pretty good description of XSLT. Until you say that you want a rule to match a sequence of nodes, rather than a single node.

But if the sequence of nodes you are matching is the sequence of children of some parent node, then you can recast this as a rule for matching the parent node.

The pattern matching language in XSLT isn't as powerful as you are looking for, but it could perhaps be adapted to your needs. Two possibilities that come to mind are (a) convert the structural information that you want to match on into a string, and use regular expression matching to assess the string, or (b) write XSD complex type definitions for the grammar that you want to match, and use the XSLT validate-by-type capability (in conjunction with XSLT 3.0's try/catch) to test whether the sequence of nodes matches a named complex type in the schema.

于 2012-04-17T07:50:42.500 回答