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:28:27 -0000
Hi Dan,

There are a bunch of things I might change about this approach, but the error
you are getting could be addressed (simply enough, I think) by changing your
template matching "@product | @audience" to match strings instead -- or even
untyped atomic values, if that's what distinct-values() is returning. (I
haven't looked it up but I think it's strings.)

Try match=".[. instance of xs:string]" or just plain match="." on that
template in mode 'conditions' and see what happens.

There are other reasons it could be slow or things I might do differently, but
I'll leave those comments aside for now or for others.

Cheers, Wendell



-----Original Message-----
From: dvint@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Thursday, February 8, 2024 5:12 PM
To: xsl <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject: [xsl] Find several different attribute values on many elements

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($ditacollectionStr
ing)//*/@audience)"
 >
                        <xsl:value-of select="concat(., ' ')"/>
                </xsl:for-each>
                <xsl:for-each
                        select="distinct-values(collection($ditacollectionStr
ing)//*/@platform)"
 >
                        <xsl:value-of select="concat(., ' ')"/>
                </xsl:for-each>
                <xsl:for-each
                        select="distinct-values(collection($ditacollectionStr
ing)//*/@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($ditacolle
ctionString)//element())"
 >
                                <xsl:apply-templates mode="conditions"/>

                        </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()?

Current Thread