【发布时间】:2018-07-11 12:33:50
【问题描述】:
假设我有一棵这样的树(但实际上,像 HTML 文档一样有数千个节点):
a
____________|____________
| |
b f
____________| ____|____
| | | |
c m x y
____|____ __|__ |
| | | | | | w
d e r s q u
|
t
我想使用这种“树正则表达式”查询子树(其中 * 表示跳过节点,字母是节点标签或标签):
__ __ __ __
/ \ / \
| a | | a a a |
| / \ | | / \ | / \ |
| b f | | b f z * f |
| | | OR | | AND AND / \ \ |
| c | | x n o w |
| / \ | | | |
| d e | | p |
\__ __/ \__ __/
想知道 XSLT、XQuery、XPath、CSS 选择器或类似的东西是否可以执行这样的查询。如果是这样,它将如何在高水平上完成。我只是很快就写了这个例子,没有真正考虑它是否能很好地工作,所以也许很难尝试这个查询的一部分,比如第一个块或最后一个块。
更新
这与示例 HTML 文档中的图像几乎相同:
<a>
<b id="foo">
<c>
<d id="bar"></d>
<e></e>
<r></r>
<s>
<t></t>
</s>
</c>
<m>
<q></q>
<u></u>
</m>
</b>
<f id="baz">
<x></x>
<y>
<w></w>
</y>
</f>
</a>
这将是与之匹配的模式:
<a>
<b>
<c>
<d></d>
<e></e>
</c>
</b>
<f></f>
</a>
这将是输出:
<a>
<b id="foo">
<c>
<d id="bar"></d>
<e></e>
</c>
</b>
<f id="baz"></f>
</a>
或者这个,任一个:
<a>
<b id="foo">
<c>
<d id="bar"></d>
<e></e>
</c>
</b>
<f id="baz">
<x></x>
<y>
<w></w>
</y>
</f>
</a>
【问题讨论】:
-
所以你想让选择器从现有的树中返回你的新树?例如,
x不是来自第一棵树的b的子节点,但您希望 XPath/CSS 选择器返回您的树,其中x是b的子节点,对吧? -
别这么想。我希望 XPath/CSS 从第一个图像中返回与第二个图像中的任何一个树匹配的子树。第一张图是完整树,第二张图是查询树。如果不匹配,则不会返回任何内容。
-
嗯...好的。因此,关于第一个“子树”,您希望选择器返回
a节点,以防 它包含f子节点和b子节点,其中c子节点具有d和e子节点 i> 等等...? -
所以对于第二张图片中的
a,b,c,d,e,f图像,我希望它返回与第一张图片中的这些标签匹配的实际节点(第一张图片与之匹配)。 -
那么不仅
a节点,而且在case结构匹配的情况下所有6个节点?我不确定,但它看起来像一个 X-Y 问题。你能分享更真实的例子(真正的 HTML/XML DOM 示例)和你想要的输出吗?
标签: xml xslt xpath css-selectors xquery