Subject: Re: [xsl] How to set an element as the context without using a for-each loop? From: "Pieter Masereeuw pieter@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 1 May 2024 11:49:52 -0000 |
Exactly for this reason, I once suggested to add <xsl:with> (or maybe: <xsl:with-context>) to the language. It would be like <xsl:for-each>, but has the benefit that there could be a check if the select-expression really matches only one item, not more. There can be discussion on whether or not to allow the select-expression to match an empty sequence. Currently, I use to add a comment to my <xsl:for-each> that explains that it will iterate only once. Pieter On 5/1/24 13:31, David Carlisle d.p.carlisle@xxxxxxxxx wrote: > > B <xsl:sequence > select="$record/(f:convert(Customer_or_Area_Code),f:convert(Cycle_Date),f:convert(Sequence_Number))"/> > > David > > On Wed, 1 May 2024 at 12:28, Roger L Costello costello@xxxxxxxxx > <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > Hi Folks, > > I have a function that I pass "record" to: > > <xsl:function name="f:procedureLeg" as="element()+"> > B B B B <xsl:param name="record" as="element()"/> > B B B B ... > </xsl:function> > > "record" is an element that contains a bunch of child elements > which the function must process. > > So, "record" is the context for those child elements. > > One approach to process the child elements is to qualify them with > "$record/" like this: > > <xsl:function name="f:procedureLeg" as="element()+"> > B B B B <xsl:param name="record" as="element()"/> > > B B B B <xsl:sequence > select="f:convert($record/Customer_or_Area_Code)"/> > B B B B <xsl:sequence select="f:convert($record/Cycle_Date)"/> > B B B B <xsl:sequence select="f:convert($record/Sequence_Number)"/> > B B B ... > </xsl:function> > > That's horrible. Qualifying every child element is tedious and > error prone (I am likely to forget to qualify some child elements). > > Another approach, which avoids qualifying every child element, is > to set the context via a for-each loop: > > <xsl:function name="f:procedureLeg" as="element()+"> > B B B B <xsl:param name="record" as="element()"/> > > B B B B <xsl:for-each select="$record"> > B B B B B B B <xsl:sequence select="f:convert(Customer_or_Area_Code)"/> > B B B B B B B <xsl:sequence select="f:convert(Cycle_Date)"/> > B B B B B B B <xsl:sequence select="f:convert(Sequence_Number)"/> > B B B B B B ... > B B B </xsl:for-each> > </xsl:function> > > That's lousy as well. "record" is just a single element; I > shouldn't be looping over a single element (in my opinion). > > Is there a better way? One that doesn't involve qualifying every > child element and doesn't involve looping over a single element? > > /Roger > > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/3208261> > (by email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] How to set an element as , David Carlisle d.p.c | Thread | Re: [xsl] How to set an element as , Graydon graydon@xxxx |
Re: [xsl] How to set an element as , David Carlisle d.p.c | Date | Re: [xsl] How to set an element as , Graydon graydon@xxxx |
Month |