[Top] [All Lists]

Re: [xsl] Recursion not recursing, or not passing parameter. Multiple search/ replace.

2015-12-17 06:14:09
Kerry, Richard richard(_dot_)kerry(_at_)atos(_dot_)net wrote:
I am trying to write an XSLT stylesheet that does a multiple search and
replace.  In order to make it work with multiple search/replace string
pairs I think I need to use recursion, calling the built-in replace
function for each pair.  However I don't seem to be getting the
parameter set, or used, properly when I try to do the recursive call to
do the next pair.

I set up the pairs in a sequence of elements as follows:

  <xsl:variable name="replace-spec" >
    <replace source="smith_component" replacement="{$new-name}" />

    <replace source="$ref-uuid-1" replacement="{$new-uuid-1}" />
    <replace source="$ref-uuid-2" replacement="{$new-uuid-2}" />


Here your variable is a tree fragment with three `replace` child elements.

    <xsl:variable name="replace-1" select="$replace-spec/replace[1]" />

Here you select the first child element.

    <xsl:variable name="source-text" as="xs:string"
select="$replace-1/@source <mailto:$replace-1/@source>" />
    <xsl:variable name="replacement-text" as="xs:string"
select="$replace-1/@replacement <mailto:$replace-1/@replacement>" />

    <xsl:variable name="template-text-2" as="xs:string" select="replace(
$source-string, $source-text, $replacement-text )" />

    <xsl:variable name="replace-remainder"
select="$replace-1/following-sibling::*" />

Here you select the two following sibling elements

      <xsl:when test="$replace-remainder" >
         <xsl:variable name="template-text-3"
as="xs:string" select="my:replace-sequence( $template-text-2,
$replace-remainder )" />

and pass them on, which means in the recursive call you are trying to select the replace[1] child of those siblings, and they don't have children.

So you rather want to set up the variable as

<xsl:variable name="replace-spec" as="element(replace)*">...</xsl:variable>

then in the function select

  <xsl:variable name="replace-1" select="$replace-spec[1]" />

and further on

<xsl:variable name="replace-remainder" select="$replace-spec[position() gt 1]" />

XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com

<Prev in Thread] Current Thread [Next in Thread>
  • Re: [xsl] Recursion not recursing, or not passing parameter. Multiple search/ replace., Martin Honnen martin(_dot_)honnen(_at_)gmx(_dot_)de <=