【问题标题】:XPath using string functions in the middle of the pathXPath 在路径中间使用字符串函数
【发布时间】:2012-09-06 21:04:48
【问题描述】:

我正在尝试使用 Web Deploy 3.0 在部署之前对我的 web.config 进行更改。假设我有以下 xml:

<node>
    <subnode>
        <connectInfo httpURL="http://LookImAUrl.com" />
    </subnode>
<node>

我想只匹配“http://...”中的“http”,这样我就可以用 https 替换它。

我研究了 XPath 字符串函数并理解了它们——我只是不知道如何将它们放在表达式的中间,例如:

"//node/subnode/connectInfo/@httpURL/substring-before(../@httpURL,':')" 

这基本上是我想做的,但看起来不太对。

【问题讨论】:

  • 您的表达式在 XPath 2.0 中很好,但在 XPath 1.0 中不行。

标签: xpath web-deployment webdeploy


【解决方案1】:
 "//node/subnode/connectInfo/@httpURL/substring-before(../@httpURL,':')" 

这基本上是我想做的,但看起来不太对。

但它是正确的,并且会匹配http。

(顺便说一句,你可以写得更短,没有..

    //node/subnode/connectInfo/@httpURL/substring-before(.,':')

)

但是,它将返回字符串“http”,而不是某种指向@httpUrl 值的指针,这是不可能的,因为值中没有部分节点。

(在 XPath 2 中,)您可以返回属性和新值,然后可能在调用语言中更改它

    //node/subnode/connectInfo/@httpURL/(., concat("https:", substring-after(.,':')))

【讨论】:

  • 当我尝试加载 xml 时,XPath 表达式中出现invalid token 错误。
  • 它可能不适用于 XPath 1.0。我用 XPath 2.0 对其进行了测试,结果很好
【解决方案2】:

使用 XPath 1.0,如果要返回 URL 的初始部分,请使用:

substring-before(//node/subnode/connectInfo/@httpURL,':')

请注意,这将仅返回第一个 connectInfo 元素的值。

如果要获取使用 HTTP 的 connectInfo 节点:

//node/subnode/connectInfo[starts-with(@httpURL,'http:')]

如果你想获取所有使用 HTTP 的httpURL

//node/subnode/connectInfo/@httpURL[starts-with(.,'http:')]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    相关资源
    最近更新 更多