Subject: Re: [xsl] another beginner question - strip directory info from variable From: "Syd Bauman s.bauman@xxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sun, 14 Oct 2018 08:12:45 -0000 |
Dave -- I really like "tokenize( $filepath, '/')[last()]" for this. You may well have tried that very thing, but the problem is you are handing the tokenize() function a sequence of multiple filepaths, not just a single filepath. To deal with this, you probably want to process the sequence of filepaths such that you are only handling one at a time. I don't know what is the *best* way to do this, but here are three that all work. --------- begin demo XSLT program --------- <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math" version="3.0"> <!-- tell processor I just what Unicode text, not XML, as output --> <xsl:output method="text"/> <!-- set up test variable; allow user to change via parameter if she wants --> <xsl:param name="jpgs" select="('dir1/jpg001.jpg', 'dir1/jpg002.jpg', 'dir1/jpg003.jpg')"/> <!-- Just match the document and perform test b thus it does not matter what the input file is, as we never even look at it. --> <xsl:template match="/"> <xsl:text>Method 1, xsl:for-each:
</xsl:text> <xsl:for-each select="$jpgs"> <xsl:text> * JPG#</xsl:text> <xsl:value-of select="position()"/> <xsl:text> is </xsl:text> <xsl:value-of select="tokenize( ., '/')[last()]"/> <xsl:text>
</xsl:text> </xsl:for-each> <xsl:text>
Method 2, XPath for loop:
</xsl:text> <xsl:variable name="jpgs_sans_dirs" select="for $j in $jpgs return tokenize($j,'/')[last()]"/> <!-- Now use xsl:for-each just to print them out nicely --> <xsl:for-each select="$jpgs_sans_dirs"> <xsl:text> - JPG#</xsl:text> <xsl:value-of select="position()"/> <xsl:text> is </xsl:text> <xsl:value-of select="."/> <xsl:text>
</xsl:text> </xsl:for-each> <xsl:text>
Method 3, xsl:iterate:
</xsl:text> <xsl:iterate select="$jpgs"> <xsl:text> + JPG#</xsl:text> <xsl:value-of select="position()"/> <xsl:text> is </xsl:text> <xsl:value-of select="tokenize( ., '/')[last()]"/> <xsl:text>
</xsl:text> </xsl:iterate> </xsl:template> </xsl:stylesheet> --------- end demo XSLT program --------- > Hi again everyone - back with another beginner question. > > I'm working in Oxygen and am using Saxon. > > I'm searching through a bunch of xml files in search of jpg names. I'm > creating variables as follows: > > <xsl:variable name="allxml" > select="collection('..//xml/?select=*.xml;recurse=yes')"/> > <xsl:variable name="jpgs" select="$allxml//element/@n"/> > > $jpgs looks like: > > dir1/jpg001.jpg dir1/jpg002.jpg dir1/jpg003.jpg > > etc. > > I want to strip away the dir info, but am having a hard time. I've tried > using tokenize and substring-after but both return similar errors. > > "A sequence of more than one item is not allowed as the first argument > of fn:tokenize() ("dir1/jpg001.jpg", "dir1/jpg002.jpg")." > > Because I don't know what I'm doing, I don't know what I'm doing wrong. :) > > Can anyone help me figure out how to solve this problem?
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] another beginner question - s, Dave Lang emaildavel | Thread | Re: [xsl] another beginner question, Martin Honnen martin |
[xsl] another beginner question - s, Dave Lang emaildavel | Date | Re: [xsl] another beginner question, Martin Honnen martin |
Month |