Kevin
Kevin

Reputation: 6831

xQuery substring problem

I now have a full path for a file as a string like:

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

However, now I need to take out only the folder path, so it will be the above string without the last back slash content like:

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

But it seems that the substring() function in xQuery only has substring(string,start,len) or substring(string,start), I am trying to figure out a way to specify the last occurence of the backslash, but no luck.

Could experts help? Thanks!

Upvotes: 1

Views: 518

Answers (4)

Dimitre Novatchev
Dimitre Novatchev

Reputation: 243479

This can be done even with a single XPath 2.0 (subset of XQuery) expression:

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

where $fullPath should be substituted with the actual string, such as:

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

Upvotes: 1

Gunther
Gunther

Reputation: 5256

fn:replace can do the job with a regular expression:

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

Upvotes: 2

Evan Lenz
Evan Lenz

Reputation: 4126

Try out the tokenize() function (for splitting a string into its component parts) and then re-assembling it, using everything but the last part.

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,'/'),'/')

For more details on these functions, check out their reference pages:

Upvotes: 2

Ghislain Fourny
Ghislain Fourny

Reputation: 7279

The following code tokenizes, removes the last token, replaces it with an empty string, and joins back.

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

It seems to return the desired result on try.zorba-xquery.com. Does this help?

Upvotes: 1

Related Questions