首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xpath选择祖先

Xpath选择祖先
EN

Stack Overflow用户
提问于 2018-03-10 10:55:08
回答 2查看 4.6K关注 0票数 5

我试图找到一个公式,根据元素在XML层次结构中的位置为元素创建URL。

这是我的示例xml:

代码语言:javascript
复制
<Xml>
    <Site Url="http://mysite.abc">
        <Content></Content>
        <SubSites>
            <Site Url="/sub1">
                <Content></Content>
                <SubSites>
                    <Site Url="/sub2">
                        <Content></Content>
                        <SubSites>
                            <Site Url="/sub3">
                                <Content></Content>
                            </Site>
                        </SubSites>
                    </Site>
                </SubSites>
            </Site>
        </SubSites>
    </Site>
</Xml>

我在Powershell中有一个函数,它从顶部递归地迭代,在每个'Content‘元素上,我想生成祖先Url值的连接。因此,它应该为每个“内容”节点连续生成:

代码语言:javascript
复制
http://mysite.abc
http://mysite.abc/sub1
http://mysite.abc/sub1/sub2
http://mysite.abc/sub1/sub2/sub3

我现在使用它作为开始:( $Node = 'Content‘元素)

代码语言:javascript
复制
$Sites = $Node | Select-XML -XPath  "//ancestor::Site"

但是对于每一个$Node,它都会选择所有的“站点”元素。它希望在xml结构中找到更多的祖先。

如果有人知道如何将这些值直接连接到Xpath中,这将是非常棒的,但首先,我很乐意知道我的当前方法到底出了什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-10 11:15:52

//ancestor::Site将为您提供相对于树中任何节点(//)的祖先Site节点。

使用./ancestor::Site只获取相对于当前节点(.)的祖先:

代码语言:javascript
复制
$Sites = $Node | Select-XML -XPath  "./ancestor::Site"
票数 5
EN

Stack Overflow用户

发布于 2018-03-10 15:07:59

Mathias R. Jessen's helpful answer提供一个替代方案(它很好地解释了您的方法的问题,并提供了一个有效的解决方案):

由于Site 节点似乎总是任何给定Content节点的父级节点,因此您可以简单地使用E 217 .. E 121路径组件<代码>E 222引用相应的节点。

这种方法允许您同时处理整个文档。

代码语言:javascript
复制
Select-Xml -LiteralPath sample.xml -XPath  "//Content/.." | ForEach-Object -Begin {
    $ancestralUrl = ''
  } -Process {
    $thisUrl = $_.Node.Url
    if ($thisUrl -match '^https?://') {
      $ancestralUrl = $thisUrl
    } else {
      $thisUrl = $ancestralUrl += $thisUrl
    }
    $thisUrl
  }

上述收益率:

代码语言:javascript
复制
http://mysite.abc
http://mysite.abc/sub1
http://mysite.abc/sub1/sub2
http://mysite.abc/sub1/sub2/sub3

实际上,您甚至可以将上述方法与ancestor 函数结合起来(尽管在这里这样做有点过分):

代码语言:javascript
复制
Select-Xml -LiteralPath sample.xml '//Content/ancestor::Site' | ForEach-Object -Begin {
  $ancestralUrl = ''
} -Process {
  $thisUrl = $_.Node.Url
  if ($thisUrl -match '^https?://') {
    $ancestralUrl = $thisUrl
  } else {
    $thisUrl = $ancestralUrl += $thisUrl
  }
  $thisUrl
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49208236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档