There could be a bug, but we don't have enough here to reproduce it.

That error message: No element corresponding to step {}foo, means that to
Daffodil, the path /Document/foo doesn't make sense because Daffodil cannot
find the element declaration for foo as a child element declaration of the
element declaration for Document.  The "{}" would contain a namespace URI
if the foo element it was seeking was in a namespace. It is seeking a
no-namespace child element decl for foo.

Normally that message would also tell you what the possibilities for
children of Document are (assuming there are some children of Document). Do
you also get that in the error message? I think it should be telling you
your choices are {}row and perhaps others.

Is foo a local element declaration with no namespace (meaning schema's
elementFormDefault='unqualified')?

Assuming we figure out why it can't find your foo element decl, you are on
the right track with the if (fn:exists(... stuff.

In DFDL expressions, you can't just issue an expression as a query and get
back "empty node set" to indicate that the expression wasn't meaningful.
The expression must (a) be type-correct vis a vis the schema (b) cannot ask
for counts, values, null-ness, etc. of things that are non-existing. This
allows us to detect most errors at schema compilation time, not run time.
It also allows the run-time to be very efficient with almost no runtime
checking required.

On Thu, Jan 4, 2024 at 7:09 AM Roger L Costello <coste...@mitre.org> wrote:

> Suppose in the future there will be a foo element. So, I first test for
> the existence of foo:
>
>
>
> {
>
>     if (fn:exists(/Document/foo)) then
> fn:count(/Document/row)+fn:count(/Document/foo)+1
>
>     else fn:count(/Document/row)+1
>
> }
>
>
>
> Daffodil gives the same error message: No element corresponding to step
> {}foo found.
>
>
>
> Eek! That seems like a bug in Daffodil. Or a bug in the DFDL
> specification. Or both. Yes?
>
>
>
> /Roger
>
>
>
> *From:* Roger L Costello <coste...@mitre.org>
> *Sent:* Thursday, January 4, 2024 6:49 AM
> *To:* users@daffodil.apache.org
> *Subject:* Re: How to count the number of child elements of the root
> element?
>
>
>
> Mike said:
>
>
>
>    - { fn:count(/Document/row) + 1 } should give the value you want.
>
>
>
> Question: Suppose I call fn:count on a non-existent foo element:
>
>
>
> {fn:count(/Document/row)+fn:count(/Document/foo)+1}
>
>
>
> I would expect fn:count(/Document/foo) to return 0 since there are no foo
> elements. But it doesn’t. Daffodil generates an error. Why is that?
>
>
>
> /Roger
>
>
>
> *From:* Mike Beckerle <mbecke...@apache.org>
> *Sent:* Tuesday, January 2, 2024 8:32 AM
> *To:* users@daffodil.apache.org
> *Subject:* [EXT] Re: How to count the number of child elements of the
> root element?
>
>
>
> DFDL's count function does not operate on any "node set", but on specific
> named array elements only. In your case, the array is the row element, so {
> fn: count(/Document/row) + 1 } should give the value you want. On Wed, Dec
> 27,
>
> DFDL's count function does not operate on any "node set", but on specific
> named array elements only.
>
>
>
> In your case, the array is the row element, so { fn:count(/Document/row) +
> 1 } should give the value you want.
>
>
>
> On Wed, Dec 27, 2023 at 8:44 AM Roger L Costello <coste...@mitre.org>
> wrote:
>
> Hi Folks,
>
>
>
> My input file has a field containing the number of “words” in the file,
> where the “words” are the child elements of the root element. Here’s the
> XML that parsing produces:
>
>
>
> <Document>
>     <initial_word>
>         <message_length>3</message_length>
>     </initial_word>
>     <row>...</row>
>     <row>...</row>
> </Document>
>
>
>
> The message_length is the initial_word + number of <row> elements, i.e., 1
> + 2 = 3
>
>
>
> I would like to hide message_length because it provides no meaningful
> information in the XML (after all, if you want to know the message length
> simply count the child elements of <Document>).
>
>
>
> To hide message_length, I will need a hidden group in my DFDL schema:
>
>
>
>     <xs:group name="hidden-MESSAGE_LENGTH ">
>         <xs:sequence>
>             <xs:element name="hidden" type="unsignedint3"
> dfdl:outputValueCalc="{????}"/>
>         </xs:sequence>
>     </xs:group>
>
>
>
> The challenge that I am having is what XPath to use in
> dfdl:outputValueCalc. Initially, I used this:
>
>
>
> dfdl:outputValueCalc="{fn:count(/Document/*)}
>
>
>
> Daffodil complained: *Wildcard * is not supported.*
>
>
>
> Then I tried this:
>
>
>
> dfdl:outputValueCalc="{fn:count(../following-sibling::row)+1}
>
>
>
> Daffodil complained: *following-sibling axis is not supported.*
>
>
>
> Eek!
>
>
>
> I don’t know what else to try. Any suggestions?
>
>
>
> /Roger
>
>
>
>

Reply via email to