我试图找到一个公式,根据元素在XML层次结构中的位置为元素创建URL。
这是我的示例xml:
<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值的连接。因此,它应该为每个“内容”节点连续生成:
http://mysite.abc
http://mysite.abc/sub1
http://mysite.abc/sub1/sub2
http://mysite.abc/sub1/sub2/sub3我现在使用它作为开始:( $Node = 'Content‘元素)
$Sites = $Node | Select-XML -XPath "//ancestor::Site"但是对于每一个$Node,它都会选择所有的“站点”元素。它希望在xml结构中找到更多的祖先。
如果有人知道如何将这些值直接连接到Xpath中,这将是非常棒的,但首先,我很乐意知道我的当前方法到底出了什么问题。
发布于 2018-03-10 11:15:52
//ancestor::Site将为您提供相对于树中任何节点(//)的祖先Site节点。
使用./ancestor::Site只获取相对于当前节点(.)的祖先:
$Sites = $Node | Select-XML -XPath "./ancestor::Site"发布于 2018-03-10 15:07:59
为Mathias R. Jessen's helpful answer提供一个替代方案(它很好地解释了您的方法的问题,并提供了一个有效的解决方案):
由于Site 节点似乎总是任何给定Content节点的父级节点,因此您可以简单地使用E 217 .. E 121路径组件<代码>E 222引用相应的节点。
这种方法允许您同时处理整个文档。
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
}上述收益率:
http://mysite.abc
http://mysite.abc/sub1
http://mysite.abc/sub1/sub2
http://mysite.abc/sub1/sub2/sub3实际上,您甚至可以将上述方法与ancestor 函数结合起来(尽管在这里这样做有点过分):
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
}https://stackoverflow.com/questions/49208236
复制相似问题