Re: [xsl] template matching with modes, not seeing what I expect

Subject: Re: [xsl] template matching with modes, not seeing what I expect
From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sun, 15 Mar 2020 18:23:42 -0000
Hey Trevor,

To add to your XPath arsenal, consider also the XPath 2.0 functions
exists() and empty().

Where you have, for example, not(not(section)), you might wish to
rewrite as not(empty(child::section)) which is indeed the same as
exists(child::section). This might help to expose all the logic.

Additionally, we have operators in XPath 2.0

union - same as | - e.g. (title union section)
except - I mentioned (* except title)
intersect  - works as you would expect --

and also the "is" operation for node identity ...

Mulberry Technologies Inc. Quick Reference to XPath 2.0:
http://mulberrytech.com/quickref/xpath2.pdf

Cheers, Wendell

On Sun, Mar 15, 2020 at 2:07 PM Trevor Nicholls
trevor@xxxxxxxxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
wrote:
>
> Well the good news is that the simple test example I just created for you
> did copy the input document, although the subsects attributes were not all
> correctly filled in. While I work on chasing down the programming error that
> must be buried in there somewhere, I still have the problem of why my simple
> example incorrectly sets the attribute.
>
> Adding debug content has shown that my test message is correctly
> constructing the temporary structure, so this problem lies in my tests for
> the type of content.
>
> Given this for $tempstruct:
>
> <section>
>   <title />
>   <section />
>   <section />
> </section>
>
> the attribute should be "all"
>
> Given this:
>
> <section>
>   <title />
>   <para />
>   <table />
>   <para />
>   <img />
> </section>
>
> the attribute should be "none"
>
> and given this:
>
> <section>
>   <title>
>   <section />
>   <section />
>   <para />
>   <section />
> </section>
>
> the attribute should be "mixed"
>
> The process I am using to try to get this result is ($tempstruct is passed
> in as the parameter "top"):
>
> <xsl:template name="testsections">
>   <xsl:param name="top" />
>   <xsl:for-each select="$top/*">
>     <xsl:choose>
>       <xsl:when test="not(section)"><xsl:text>none</xsl:text></xsl:when>
>       <xsl:when test="not(not(section) and
> not(title))"><xsl:text>all</xsl:text></xsl:when>
>       <xsl:otherwise><xsl:text>mixed</xsl:text></xsl:otherwise>
>     </xsl:choose>
>   </xsl:for-each>
> </xsl:template>
>
> This template correctly identifies the all and none options, but returns
> "all" instead of "mixed" for the last example.
>
> Tested on my full document (which has several hundred sections) I can see
> that all the "all" sections and all the "none" sections are correct, and all
> the "mixed" sections are erroneously reported as "all".
>
> I thought the test "not(not(section) and not(title))" would be true for all
> elements that had only title and section children. Evidently that's not
> true.
>
> I tried the test "child::*[not(self::title)][not(self::section)]" as an
> alternative, but that performed even worse.
>
> I've missed some subtlety in evaluating presence and absence of specific
> child elements, and it's probably in an FAQ somewhere, but if it is I missed
> it.
>
> cheers
> T
>
>
>
> -----Original Message-----
> From: Martin Honnen martin.honnen@xxxxxx
> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
> Sent: Monday, 16 March 2020 0:53
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] template matching with modes, not seeing what I expect
>
> Am 15.03.2020 um 11:04 schrieb Trevor Nicholls trevor@xxxxxxxxxxxxxxxxxx:
>
> > I'm testing a simple stylesheet which implements a suggestion made in
> > reply to my previous approach, i.e. that I could process the output of
> > a document into a variable to test. When the stylesheet is just
> > reporting the results, it works just fine, but when I combine it with
> > templates which copy the input document and replace one attribute
> > based on those tests, the input document is not being copied.
>
> > But if I run this stylesheet and give it an input file (with no
> > subsects
> > attributes) which contains a parent with multiple sections and mixed
> > content, only the first section is output with the attribute
> > (incorrectly set to "none"), and the rest of the output XML is the
> > result of the mode="check" versions of the templates, i.e. the only
> > output is the initial XML header followed by a copy of the $tempstruct
> > variable built when the context node is the top level element of the
> > input document.. The default templates simply aren't executed.
>
> Can you show us a minimal sample input together with the output you get and
> then one you want?
>
>
> 



-- 
...Wendell Piez... ...wendell -at- nist -dot- gov...
...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org...
...github.com/wendellpiez... ...gitlab.coko.foundation/wendell...

Current Thread