我已经搜索了所有具有包含(substring)字符串属性的节点。这些节点可以在树的不同级别找到,有时深5或6级。我想知道他们在指定级别,2级深度对应的父/祖先节点。搜索的结果应该远远大于相应父母的结果。
编辑包含代码:
/xs:schema/xs:element/descendant::node()/@*[starts-with(., 'my-search-string-here')]
编辑澄清我的意图:
当我执行上面的Xpath时,结果有时
/xs:schema/xs:element/xs:complexType/xs:attribute
或
/xs:schema/xs:element/xs:complexType/xs:sequence/xs:element
或
/xs:schema/xs:element/xs:complexType/xs:complexContent/xs:extension/xs:sequence/xs:element
这些结果表明我在Schema中添加了特定于应用程序的代码。但是,我现在需要删除此代码。我正在构建一个“适配器”架构,它将redefine
原始架构(未触及)和import
我的架构。我正在搜索的字符串是我的前缀。我需要的是/ xs:schema / node()的@name,其中找到了前缀,因此我可以创建一个定义这些元素的新模式。它们将被导入适配器并重新定义另一个模式(我不应该修改)。
重申一下,我需要搜索所有属性(/ xs:schema / xs:element的后代)作为前缀,然后为每个匹配项获取相应的/ xs:schema / xs:element / @ name搜索。
答案 0 :(得分:1)
重申一下,我需要搜索所有属性(/ xs:schema / xs:element的后代)作为前缀,然后获取相应的/ xs:schema / xs:element / @每个匹配搜索的名称。
/
xs:schema/
xs:element
[descendant::*/@*[starts-with(., 'my-search-string-here')]]/
@name
答案 1 :(得分:1)
这应该这样做:
/xs:schema/xs:element[starts-with(descendant::node()/@*, 'my-search-string-here')]
你想把它想象成
选择包含具有匹配属性
的节点的xs:element
而不是
选择
xs:element
s的后代节点的匹配属性,然后重新开始
答案 2 :(得分:0)
正如Eric所说,我需要将我的思维过程改为select the xs:elements which contain a node with a matching attribute
而不是select the matching attributes of descendant nodes of xs:elements, then work back up
。这很关键。但是,他发布的代码示例选择属性不起作用,我们需要使用另一种解决方案。
这是用于选择包含*(substring)字符串的属性的元素的代码。
/xs:schema/child::node()[descendant::node()/@*[starts-with(., 'my-prefix-here')]]