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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] template matching with mo, David Carlisle d.p.c | Thread | Re: [xsl] template matching with mo, Trevor Nicholls trev |
Re: [xsl] template matching with mo, David Carlisle d.p.c | Date | Re: [xsl] template matching with mo, Trevor Nicholls trev |
Month |