xsl-list
[Top] [All Lists]

Re: [xsl] Global Variables in streaming xslts

2016-08-15 11:46:19

On 15 Aug 2016, at 16:46, Mailing Lists Mail daktapaal(_at_)gmail(_dot_)com 
<xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

Dear All..
I have some.more questions

1. How do we get the global Xpaths.. That can be used else where.



Basically, you can't. The code you provide isn't streamable.

There may be workarounds. For example, you could process the input stream 
twice, once to extract the "lookup" information, and once to process the data 
that references it. Then you might write:

<xsl:variable name="WaterSpeciesDisplayIndicator" as="xs:boolean">
  <xsl:stream href="UniverseKingdom.xml">
    
<xsl:select="/*:UniverseKingdom/*:DisplayIndicators/*:WaterSpeciesDisplayIndicator
 = 'true'"/>
  </xsl:stream>
</xsl:variable>

Note that (in Saxon at any rate) this will stop processing the input stream as 
soon as a qualifying element is found, so it may not be as expensive as 
processing the whole document twice.

If the lookup data is at the start of the file, and always appears before you 
need it, then another approach is to use accumulators. These read data "in the 
background" as the input stream is being read:

<xsl:accumulator name="indicator" as="xs:boolean" initial-value="false()">
  <xsl:accumulator-rule 
match="/*:UniverseKingdom/*:DisplayIndicators/*:WaterSpeciesDisplayIndicator/text()[.
 = 'true']"
     select="true()"/>
</xsl:accumulator>

which you can then reference as <xsl:if 
test="accumulator-before('indicator')">....

Michael Kay
Saxonica
    
select="/*:UniverseKingdom/*:DisplayIndicators/*:WaterSpeciesDisplayIndicator 
= 'true'"/>

  example: I want to know somewhere in some template the value of some other 
element : for example  In Amphibian template definition, I want to know if  
WaterSpeciesDisplayIndicator is set to true :

 Code:

  <xsl:transform version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform 
<http://www.w3.org/1999/XSL/Transform>" xmlns:saxon="http://saxon.sf.net/ 
<http://saxon.sf.net/>" 
xmlns:multiclass="http://www.csp.com/Securitization/csp-multiclass 
<http://www.csp.com/Securitization/csp-multiclass>" 
xmlns:mismo="http://www.mismo.org/residential/2009/schemas 
<http://www.mismo.org/residential/2009/schemas>">

            <xsl:mode name="stream" streamable="yes" 
on-no-match="shallow-copy"/>

            <xsl:output method="xml" indent="yes"/>

           <xsl:variable name="WaterSpeciesDisplayIndicator" 
select="/*:UniverseKingdom/*:DisplayIndicators/*:WaterSpeciesDisplayIndicator 
= 'true'"/>

 
            <xsl:template match="/">

   <xsl:stream href="UniverseKingdom.xml">

         <xsl:apply-templates mode="stream"/>
                        </xsl:stream>
            </xsl:template>

           
           
            <xsl:template match="*:Amphibian">
               
 <xsl:if test = "$WaterSpeciesDisplayIndicator"> <xsl:copy-of select = "."/>  
             
</xsl:if>

            </xsl:template>

            I know that GLobal parameters will not work because the variables 
probably doesnt know the XML we are streaming at the time of declaration. I 
also know that from the template match for Amphibian, I can not get to the 
xpath of 
/*:UniverseKingdom/*:DisplayIndicators/*:WaterSpeciesDisplayIndicator.

           I am not sure how else I should be getting the 
WaterSpeciesDisplayIndicator Value

Thanks
XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list>
EasyUnsubscribe <-list/293509> (by email <>)
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>