Re: [xslt] Issues using parameters with namespaces

2022-03-01 Thread George Joseph via xslt
On Tue, Mar 1, 2022 at 3:37 AM Nick Wellnhofer  wrote:

> On 28/02/2022 22:07, George Joseph wrote:
> > Actually "//*[name()='dm:device']" works as well so maybe that's what
> I'll do.
>
> This seems like the best work-around.
>

Yeah makes sense.   I'll need to do some performance testing regardless
of which way I go since I'm parsing SIP messages in real time.


> > Is there any reason why path parameters with namespaces haven't been
> > supported?
> > Would a pull request to add the namespaces
> in xsltNewTransformContext be
> > considered?
>
> How parameters are passed isn't covered by the standard, so it's up to the
> implementation to come up with something. It seems natural to allow XPath
> expressions, but it's not clear how to handle namespaces. Simply taking
> the
> namespace defitinions from the root element of the root stylesheet should
> do
> what most people expect, but it is somewhat fragile.
>
>
True.


> 1. Passing parameters from the command line
>
> Supporting namespaces in a clean way would probably require a separate
> channel
> to register namespaces just for parameter evaluation. Even Saxon doesn't
> seem
> to support custom namespaces in parameter expressions:
>
> "The static context for this XPath expression includes only the standard
> namespaces conventionally bound to the prefixes xs, fn, xsi, and saxon."
> [1]
>
> 2. Passing parameters using the API
>
> The most flexible approach is probably an API to set parameters directly,
> similar to Saxon's XsltTransformer [2]. This would even allow to pass
> nodes
> from external documents as parameters. But if you want to combine that
> with
> XPath expressions, you'd have to evaluate them yourself.
>
> Nick
>
>
Gotcha.  Thanks for all your help Nick!



>
> [1]
> https://www.saxonica.com/documentation11/index.html#!using-xsl/commandline
> [2]
>
> https://www.saxonica.com/documentation11/index.html#!javadoc/net.sf.saxon.s9api/XsltTransformer@setParameter
>
___
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt@gnome.org
https://mail.gnome.org/mailman/listinfo/xslt


Re: [xslt] Issues using parameters with namespaces

2022-02-28 Thread George Joseph via xslt
On Mon, Feb 28, 2022 at 2:01 PM George Joseph  wrote:

>
>
> On Mon, Feb 28, 2022 at 1:04 PM Nick Wellnhofer 
> wrote:
>
>> On 28/02/2022 20:54, George Joseph via xslt wrote:
>> >   I think it works because xsltProcessUserParamInternal only sets
>> > xpctxt->namespaces = NULL but it doesn't clear xpctxt->nsHash which is
>> where
>> > xmlXPathRegisterNs puts the namespaces to be registered.
>>
>> Right, the XPath engine uses both ->namespaces and ->nsHash.
>>
>> > Can you give me a hint?   I've had absolutely no luck is trying to pass
>> a path
>> > as a string and getting it to result in something other than "The
>> 'select'
>> > expression
>> > did not evaluate to a node set" even in an absurdly simple example.
>> I'm passing
>> > the path double quoted "'/dm:device'" and have tried various
>> combinations of
>> > "select=" and "with-param".Even Google is failing me so any help
>> would be
>> > appreciated.
>>
>> I meant that you should only use string or integer literals in parameter
>> values and no other XPath expressions at all. This means to rework your
>> stylesheets, of course.
>>
>
> I think I'll stick with my solution to add the namespaces to the xpath
> context. :)
>

Actually "//*[name()='dm:device']" works as well so maybe that's what I'll
do.



> Is there any reason why path parameters with namespaces haven't been
> supported?
> Would a pull request to add the namespaces in xsltNewTransformContext be
> considered?
>
>
>
>
>>
>> Nick
>>
>>
___
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt@gnome.org
https://mail.gnome.org/mailman/listinfo/xslt


Re: [xslt] Issues using parameters with namespaces

2022-02-28 Thread George Joseph via xslt
On Mon, Feb 28, 2022 at 1:04 PM Nick Wellnhofer  wrote:

> On 28/02/2022 20:54, George Joseph via xslt wrote:
> >   I think it works because xsltProcessUserParamInternal only sets
> > xpctxt->namespaces = NULL but it doesn't clear xpctxt->nsHash which is
> where
> > xmlXPathRegisterNs puts the namespaces to be registered.
>
> Right, the XPath engine uses both ->namespaces and ->nsHash.
>
> > Can you give me a hint?   I've had absolutely no luck is trying to pass
> a path
> > as a string and getting it to result in something other than "The
> 'select'
> > expression
> > did not evaluate to a node set" even in an absurdly simple example.  I'm
> passing
> > the path double quoted "'/dm:device'" and have tried various
> combinations of
> > "select=" and "with-param".Even Google is failing me so any help
> would be
> > appreciated.
>
> I meant that you should only use string or integer literals in parameter
> values and no other XPath expressions at all. This means to rework your
> stylesheets, of course.
>

I think I'll stick with my solution to add the namespaces to the xpath
context. :)
Is there any reason why path parameters with namespaces haven't been
supported?
Would a pull request to add the namespaces in xsltNewTransformContext be
considered?




>
> Nick
>
>
___
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt@gnome.org
https://mail.gnome.org/mailman/listinfo/xslt


Re: [xslt] Issues using parameters with namespaces

2022-02-28 Thread George Joseph via xslt
On Mon, Feb 28, 2022 at 11:42 AM Nick Wellnhofer 
wrote:

> On 28/02/2022 18:50, George Joseph via xslt wrote:
> > I've been having a heck of a time trying to pass a parameter
> > to xsltApplyStylesheet
> > that has namespaces in the xpath expression.
>
> This use case is simply not supported.
>

Okay.


>
> > Finally I did find a workaround by calling xsltNewTransformContext()
> then
> > iterating
> > over the nsDefs in the stylesheet document and
> calling xmlXPathRegisterNs on
> > ctxt->xpathCtxt for each nsDef.
>
> I'm a bit puzzled that this worked at all. See the code here:
>
>
>
> https://gitlab.gnome.org/GNOME/libxslt/-/blob/master/libxslt/variables.c#L1581


 I think it works because xsltProcessUserParamInternal only sets
xpctxt->namespaces = NULL but it doesn't clear xpctxt->nsHash which is where
xmlXPathRegisterNs puts the namespaces to be registered.

>
>
> But the expression is compiled before resetting the namespaces, so I guess
> that's why.
>
> > I would have thought this would have been done automatically though.
> Did I
> > miss something or is there a better way to do this?
>
> No, I'd recommend that you only use string and integer params.
>

Can you give me a hint?   I've had absolutely no luck is trying to pass a
path
as a string and getting it to result in something other than "The 'select'
expression
did not evaluate to a node set" even in an absurdly simple example.  I'm
passing
the path double quoted "'/dm:device'" and have tried various combinations of
"select=" and "with-param".Even Google is failing me so any help would
be appreciated.

Thanks!



>
> Nick
>
___
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt@gnome.org
https://mail.gnome.org/mailman/listinfo/xslt


[xslt] Issues using parameters with namespaces

2022-02-28 Thread George Joseph via xslt
Greetings,

I've been having a heck of a time trying to pass a parameter
to xsltApplyStylesheet
that has namespaces in the xpath expression.

For example (abbreviated):
stylesheet:


 



xml:


...

$ xsltproc --param path "//dm:device" pidf_lo.xslt pidf_lo_test.xml
XPath error : Undefined namespace prefix
runtime error
Evaluating user parameter path failed

if I hard code that select="//dm:device"  it works fine.

Finally I did find a workaround by calling xsltNewTransformContext() then
iterating
over the nsDefs in the stylesheet document and calling xmlXPathRegisterNs on
ctxt->xpathCtxt for each nsDef.

I would have thought this would have been done automatically though.  Did I
miss something or is there a better way to do this?

Thanks!






-- 
George Joseph
Asterisk Software Developer
Check us out at www.sangoma.com and www.asterisk.org
[image: image.png]
___
xslt mailing list, project page http://xmlsoft.org/XSLT/
xslt@gnome.org
https://mail.gnome.org/mailman/listinfo/xslt