- From: Imsieke, Gerrit, le-tex <gerrit.imsieke@le-tex.de>
- Date: Thu, 14 Nov 2013 22:50:13 +0100
- 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