Subject: Re: [xsl] XPath which tests that an element does not have mixed content? From: Brandon Ibach <brandon.ibach@xxxxxxxxxxxxxxxxxxx> Date: Thu, 3 Nov 2011 16:08:45 -0400 |
Fair enough, though the count() is only expensive if instance documents regularly have large numbers of <Person> elements as children of <author>. There is always a trade-off between runtime cost and cognitive cost. The following equivalent expressions (pick the one you like), still usable in any version of XPath, address the concern of the cost of count() at the expense of a potentially somewhat less readable expression. Person and not(*[2]) and not(text()[normalize-space(.)]) Person and not(*[2] or text()[normalize-space(.)]) For what it's worth, these are actually somewhat tighter constraints than my original, which would not have detected non-Person element children. I believe the following should be air-tight, catching other cases such as PIs or comments. Whether the requirements actually call for this level of checking is for the original poster to clarify. Person and not(*[2] or node()[not(self::Person or self::text()[not(normalize-space(.))])]) As a final thought, the "count(...) = N" pattern seems like a straightforward case for optimization in the implementation. I expect Michael might have something to say about that. :) -Brandon :) On Thu, Nov 3, 2011 at 3:27 PM, Houghton,Andrew <houghtoa@xxxxxxxx> wrote: > count() is an expensive operation, in this case, Brandon's XML suggests that well formed instance documents should only have one Person element under the author element with the exception of instance documents having more. Many times the expression count() = 1 can be changed to not(exists(*[2])) since the second element will always exist for >1 elements without having to count *all* the elements then compare that amount against the value 1. > > Andy. > >> -----Original Message----- >> From: Brandon Ibach [mailto:brandon.ibach@xxxxxxxxxxxxxxxxxxx] >> Sent: Thursday, November 03, 2011 15:08 >> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx >> Subject: Re: [xsl] XPath which tests that an element does not have >> mixed content? >> >> I may be misinterpreting your requirement, but based on my initial >> read, I'd go with something like the following, which should work with >> any version of XPath/XSLT. It is written to be evaluated in the >> context of <author>. >> >> count(Person) = 1 and not(text()[normalize-space(.)]) >> >> -Brandon :) >> >> >> On Thu, Nov 3, 2011 at 2:44 PM, Costello, Roger L. <costello@xxxxxxxxx> >> wrote: >> > Hi Folks, >> > >> > Would you please recommend an XPath expression which ensures that the >> content of <author> is optional whitespace, <Person>, optional >> whitespace, and nothing else: >> > >> > <author> >> > <Person> >> > <name>Simon L. Peyton Jones</name> >> > </Person> >> > </author> >> > >> > The result of the XPath expression is true if the content is as >> desired and false otherwise. The XPath should return true for the above >> example and false for the below example: >> > >> > <author> >> > The person is: >> > <Person> >> > <name>Simon L. Peyton Jones</name> >> > </Person> >> > </author> >> > >> > >> > /Roger
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] XPath which tests that an, Houghton,Andrew | Thread | Re: [xsl] XPath which tests that an, Wendell Piez |
RE: [xsl] XPath which tests that an, Houghton,Andrew | Date | Re: [xsl] XPath which tests that an, David Carlisle |
Month |