W3C home > Mailing lists > Public > xproc-dev@w3.org > November 2013

Re: Calabash string-replace problem

From: Imsieke, Gerrit, le-tex <gerrit.imsieke@le-tex.de>
Date: Thu, 14 Nov 2013 22:50:13 +0100
Message-ID: <52854595.70207@le-tex.de>
To: xproc-dev@w3.org
see below

On 14.11.2013 21:30, Paul Tyson wrote:
> I must be missing something very simple, but I have tried everything I
> can think of. Thanks in advance for any assistance.
>
> Here is the problem reduced to a simple pipeline.
>
> <p:declare-step xmlns:p="http://www.w3.org/ns/xproc"
>
>                                  xmlns:html="http://www.w3.org/1999/xhtml"
>
>                                  version="1.0">
>
>    <p:output port="result"/>
>
>    <p:option name="pn" select="'foo'"/>
>
>    <p:string-replace match="//html:span/text()">
>
>      <p:input port="source">
>
>        <p:inline>
>
>                  <html:div>Part number <html:span
> style="font-weight:bold;font-size:larger">aaa</html:span> not
> found.</html:div>
>
>        </p:inline>
>
>      </p:input>
>
>      <p:with-option name="replace" select="$pn"/>

$pn will be evaluated here and expand to the string 'foo' without the 
single quotes. The situation is as if you specified

<p:string-replace match="//html:span/text()" replace="foo">

in first place, where foo will be evaluated in the context of the 
document on the source port.

Try the following expression:

<p:with-option name="replace" select="concat('''', $pn, '''')"/>

This will calculate the value of the replace option to be 'foo'.

The inner '' pairs are just escapes for a single quote, which has to be 
wrapped in single quotes in order to be part of a string. So you’re 
concatenating the string ', the string foo, and the string ' to form the 
string 'foo'.

This string is then supplied as the XPath expression for the replace 
option. When evaluated, it yields the string foo.

I hope this becomes clear. When specifying replace using p:with-option, 
you construct an XPath expression using XPath expressions.

There is no more direct way to evaluate $pn (for example, in 
replace="$pn") because the variable is not bound in the context of the 
source document.

Just play around with it and see what happens:

<p:with-option name="replace" select="'//*[local-name()=''span'']/@style'"/>

⇒ font-weight:bold;font-size:larger

<p:with-option name="replace" 
select="concat('//*[string-length(local-name(.)) gt string-length(''', 
$pn, ''')]/name()')"/>

⇒ html:span

Silly me, I first tried the expression

<p:with-option name="replace" 
select="concat('//*[string-length(local-name(.)) gt string-length(', 
$pn, ')]/name()')"/>

and got html:divhtml:span as a result. If you know why, you’ll have 
grokked it.

Gerrit
Received on Thursday, 14 November 2013 21:50:48 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:03:11 UTC