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

Subject: Re: [xsl] Find several different attribute values on many elements
From: "G. Ken Holman g.ken.holman@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 8 Feb 2024 22:19:33 -0000
Yes, the error is apt because distinct-values() returns strings. I'm assuming this is because you don't want to process elements of duplicate string value.

If you use <xsl:for-each-group group-by="." select="........"> then you will have control at the first element of each value and so your context will allow the <xsl:apply-templates/>

I hope this helps.

. . . . . Ken

At 2024-02-08 22:12 +0000, 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())" >
                                <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()?



--
Contact info, blog, articles, etc. http://www.CraneSoftwrights.com/s/ |
Check our site for free XML, XSLT, XSL-FO and UBL developer resources |
Streaming hands-on XSLT/XPath 2 training class @US$125 (5 hours free) |
Essays (UBL, XML, etc.) http://www.linkedin.com/today/author/gkholman |

Current Thread