- From: Paul Tyson <phtyson@sbcglobal.net>
- Date: Fri, 15 Nov 2013 17:56:45 -0600
- To: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@le-tex.de>
- Cc: xproc-dev@w3.org
Gerrit, thanks. Lessons learned: 1. xproc is not xslt 2. p:with-option is not the same as xsl:with-param I'll be spending more time in the XPath spec. Regards, --Paul On Thu, 2013-11-14 at 22:50 +0100, Imsieke, Gerrit, le-tex wrote: > 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 Friday, 15 November 2013 23:57:15 UTC