Re: [xsl] XPath which tests that an element does not have mixed content?

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

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