xsl-list
[Top] [All Lists]

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

2011-11-03 15:15:08
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(_at_)oclc(_dot_)org> 
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(_dot_)ibach(_at_)single-sourcing(_dot_)com]
Sent: Thursday, November 03, 2011 15:08
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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(_at_)mitre(_dot_)org>
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

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--