The rules for XSLT 3.0 streaming are incredibly complicated, and it doesn't help that there are few tutorial introductions. One extremely useful resource is Abel Braaksma's talk at XML Prague 2014: there's a transcript and a link to the YouTube recording at https://www.xfront.com/Transcript-of-Abel-Braaksma-talk-on-XSLT-Streaming-at-XML-Prague-2014.pdf
The most important rule to remember is: a template rule can only make one downward selection (it only gets one chance to scan the descendant tree). That's the rule you've broken when you wrote:
<xsl:template match="node()">
<xsl:element name="field">
<xsl:attribute name="name">
<xsl:value-of select="local-name()"/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
<xsl:apply-templates select="*"/>
</xsl:template>
Actually, that code could be simplified to
<xsl:template match="node()">
<field name="{local-name()}">{.}</field>
<xsl:apply-templates select="*"/>
</xsl:template>
But this wouldn't affect the stream ability: you're processing the descendants of the matched node twice, once to get the string value (.), and once to apply-templates to the children.
Now, it looks to me as if this template rule is only being used to process "leaf elements", that is, elements that have a text node child but no child elements. If that's the case, then the <xsl:apply-templates select="*"/> never selects anything: it's redundant and it can be removed, which makes the rule streamable.
There's another error message you're getting, which is that the template rule can return streamed nodes. The reason it's not permitted to return streamed nodes is a bit more subtle; it basically makes it impossible for the processor to do the data flow analysis to prove whether or not streaming is feasible. But it's again the <xsl:apply-templates select="*"/> that's the cause of the problem and getting rid of it fixes things.
Your next problem is with the template rule for Property elements. You've written this as
<xsl:template match="Property">
<xsl:element name="field">
<xsl:attribute name="name">
<xsl:value-of select="key"/>_s</xsl:attribute>
<xsl:value-of select="value"/>
</xsl:element>
<xsl:apply-templates select="Property"/>
</xsl:template>
and it simplifies to:
<xsl:template match="Property">
<field name="{key}_s">{value}</field>
<xsl:apply-templates select="Property"/>
</xsl:template>
This is making three downward selections: child::key, child::value, and child::Property. In your data sample, no Property element has a child called Property, so perhaps the <xsl:apply-templates/> is again redundant. For key and value one useful trick is to read them into a map:
<xsl:template match="Property">
<xsl:variable name="pair" as="map(*)">
<xsl:map>
<xsl:map-entry key="'key'" select="string(key)"/>
<xsl:map-entry key="'value'" select="string(value)"/>
</xsl:map>
</xsl:variable>
<field name="{$pair?key}_s">{$pair?value}</field>
</xsl:template>
The reason this works is that xsl:map (like xsl:fork) is an exception to the "one downward selection" rule - the map can be built up in a single pass of the input. By calling string(), we're careful not to put any streamed nodes into the map, so the data we need later has been captured in the map and we don't ever need to go back to the streamed input document to read it a second time.
I hope this gives you a feel for the way forward. Streaming in XSLT is not for the faint-hearted, but if you've got >5Gb input documents then you don't have many options open.
copy-of()of a streamed node that is "small" enough (e.g. perhaps aPropertyelement) to be materialized with all its children/descendants. But don't pretend us to understand or guess why you match onnode()where you seem to have a clear intention to process an element node, for instance.xsl:forkto have two branches of downwards selection where the processor then needs to find a buffer strategy to e.g. collect all child values of a category but also needs to process them separately. But there is not one single approach that magically makes your code streamable, you will need to invest some time in understanding the limitations of streaming (forwards only parsing, "buffering" the current node (e.g. a element nodes with its attributes or a comment or a text node, maintaining some ancestor hierarchy but not the sibling hierarchy).