xQuery子串问题

时间:2011-09-28 16:19:27

标签: xquery

我现在有一个文件的完整路径作为字符串,如:

   "/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml" 

但是,现在我只需要取出文件夹路径,所以它将是上面的字符串,没有最后一个反斜杠内容,如:

"/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/"

但似乎xQuery中的substring()函数只有substring(string,start,len)或substring(string,start),我试图找出一种方法来指定反斜杠的最后一次出现,但是没有运气。

专家能帮忙吗?谢谢!

4 个答案:

答案 0 :(得分:2)

尝试使用tokenize()函数(将字符串拆分为其组成部分),然后使用除最后一部分之外的所有内容重新组装它。

let $full-path := "/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml",
    $segments := tokenize($full-path,"/")[position() ne last()]
return
  concat(string-join($segments,'/'),'/')

有关这些功能的更多详细信息,请查看其参考页面:

答案 1 :(得分:2)

fn:replace可以使用正则表达式完成工作:

replace("/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml", 
        "[^/]+$", 
        "")

答案 2 :(得分:1)

以下代码标记化,删除最后一个标记,用空字符串替换它,然后重新加入。

string-join(
  (
    tokenize(
        "/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml",
        "/"
      )[position() ne last()],
    ""
  ),
  "/"
)

似乎在try.zorba-xquery.com上返回了所需的结果。这有帮助吗?

答案 3 :(得分:1)

即使使用单个XPath 2.0(XQuery子集)表达式也可以这样做

substring($fullPath, 
          1, 
          string-length($fullPath) - string-length(tokenize($fullPath, '/')[last()])
          )

其中$fullPath应替换为实际字符串,例如

"/db/Liebherr/Content_Repository/Techpubs/Topics/HyraulicPowerDistribution/Released/TRN_282C_HYD_MOD_1_Drive_Shaft_Rev000.xml"