[xsl] Accumulator use

Subject: [xsl] Accumulator use
From: "mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 29 Feb 2016 11:57:00 -0000
										(Sorry for bad formatting, regular email client not working)
									
										 
									I try to
cache values who are in external files referenced from my source
file :source.xml
									------------
									<root><input href="1.xml"/><input
href="2.xml"/>...</root>
									
										 
									n.xml
									------
									<root
type="typeN">...</root>
									
										 
									I want to
create a map(xs:anyUri, xs:string), where key is the external
file URI, and value is always /*/@type in the fileExternal files
may be huge, and I'd like to stream them. I create an
accumulator, stream input files using this accumulator.<xsl:accumulator name="acc"
as="map(xs:string, xs:string)"
initial-value="map{}">
									   <xsl:accumulator-rule
match="*[@value]">
									      <xsl:sequence
select="map:put($value, ./local-name(),
xs:string(./@value))"/>
									   </xsl:accumulator-rule>
									</xsl:accumulator>
									
										 
								
							
						
						
							 
						I don't see what this accumulator is
matching - there are no @value attributes in your input.
						
							
								
									<xsl:mode name="m"
streamable="yes"/><xsl:template
match="/">
							
						
						
							What is "/" here? What's the input file?
						
						
							
								
									 
 <xsl:stream
href="../../test/resources/entries.xml"
use-accumulators="acc">
							
						
						
							What is entries.xml here? Is it the same as source.xml?
						
						
							
								
									 
    <xsl:apply-templates mode="m"/>
									   </xsl:stream>
									   <!-- do here something that uses the accumulator
-->
									</xsl:template>How can I access to the accumulator after
stream processing ? I'd like to write the map content
to the output. Is it possible ?
									
										 
								
							
						
						If the only thing you need to do is
to create this map, then you don't need accumulators:
					
						 
					
						<xsl:map>
					
						<xsl:for-each
select="doc('source.xml')/root/input">
					
						  <xsl:map-entry key="@href">
					
						    <xsl:stream href="{@href}">
					
						      <xsl:value-of
select="/*/@type"/>
					
						   </xsl:stream>
					
						 </xsl:map-entry>
					
						</xsl:for-each>
					
						</xsl:map>
					
						 
					
						If you want to do other processing on the n.xml file then I would
need to see what that processing is, but it's going to be a bit
tricky because accumulators only really work within the context of a
single document.
					
						 
					
						Michael Kay
					
						Saxonica

Current Thread