Xpath返回相对于另一个节点的节点

时间:2011-09-13 17:30:49

标签: xslt xpath

我已经搜索了所有具有包含(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搜索。

3 个答案:

答案 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')]]