[xsl] Find several different attribute values on many elements

Subject: [xsl] Find several different attribute values on many elements
From: "dvint@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 8 Feb 2024 22:11:22 -0000
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())" >
<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