Re: [xsl] Find several different attribute values on many elements

Subject: Re: [xsl] Find several different attribute values on many elements
From: "Piez, Wendell A. (Fed) wendell.piez@xxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 8 Feb 2024 22:31:53 -0000
Dan,

Martin's question re: version is important because matching atomic values, not
nodes, is something we've only been able to do since ... five years ago now?
I.e., it requires XSLT 3.0.

Under XSLT 2.0 or (blessings upon you) older techs, other methods are better
anyway such as what Ken describes...

Cheers, Wendell

-----Original Message-----
From: Martin Honnen martin.honnen@xxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Thursday, February 8, 2024 5:23 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Find several different attribute values on many elements


On 08/02/2024 23:11, dvint@xxxxxxxxx wrote:
> I'm trying to process a collection of documents and extract the
> distinct-values for several attributes. My first attempt was this
> which is very slow
>
>     <xsl:variable name="ditacollectionString"
>         select="concat($srcPath, '?select=*.dita')"/>
>
>     <xsl:variable name="xmlcollectionString"
>         select="concat($srcPath, '?select=*.xml')"/>
>
>         <xsl:for-each
> select="distinct-values(collection($ditacollectionString)//*/@audience)"
> >
>             <xsl:value-of select="concat(., ' ')"/>
>         </xsl:for-each>
>         <xsl:for-each
> select="distinct-values(collection($ditacollectionString)//*/@platform)"
> >
>             <xsl:value-of select="concat(., ' ')"/>
>         </xsl:for-each>
>         <xsl:for-each
> select="distinct-values(collection($ditacollectionString)//*/@props)"
> >
>             <xsl:value-of select="concat(., ' ')"/>
>         </xsl:for-each>
>
> I'm looking for a way to just make a single for-each loop and tried
> this
>
>             <xsl:for-each
> select="distinct-values(collection($ditacollectionString)//element())"
> >


At this point you have created a sequence of (distinct) atomic values of the
contents of all elements in the collection so you are basically dealing with
strings (or other atomic values);

> <xsl:apply-templates mode="conditions"/>

therefore doing an apply-templates without a select here, which then defaults
to try to process the child nodes of the context item (which is not a node)
doesn't work out.



>
>             </xsl:for-each>
>
>     <xsl:template match="@product | @audience " mode="conditions">
>         <xsl:value-of select="concat(., ' ')"/>
>     </xsl:template>
>
> But I get an error on the <xsl:apply-templates mode="conditions"/>
> indicating The required item type of the context item is node(), but
> the supplied expression {.} has item type xs:anyAtomicType.
>
> I also need to do this with both .dita and .xml files and I'm planning
> on making 2 collections, is there a way to do one collection()?
>

Is that Saxon Java or which XSLT processor?

Current Thread