XSLT: Use of template tag variable and break condition in for-each loop -


i using xslt have created <xsl:template> tag validation using <xsl:for-each> statement , sets value of <xsl:variable> or <xsl:param> true or false.

  1. is there way break statement in for-each if condition true?
  2. can use value of template variable or param main calling routine?

example:

<!-- main xslt --> <xsl:template>   <xsl:call-template name ="testtemplate">     <!--         here want use variable or param        defined in testtemplate, possible?     -->   </xsl:call-template> </xsl:template>  <xsl:template name ="testtemplate">   <xsl:param name="eee"/>   <xsl:for-each select ="//rootnode/leafnode">     <xsl:choose>       <xsl:when test ="@type='abc'">         <xsl:value-of select ="true"/>       </xsl:when>       <xsl:otherwise>false</xsl:otherwise>     </xsl:choose>   </xsl:for-each> </xsl:template> 

to questions:

is there way break statement in for-each if condition true ?

no, , unnecessary. xslt not imperative programming language, , imperative approaches not work here.

what seemingly want expressing "find first <leafnode> @type='abc', , return true or false depending on whether there one.

the way in traditional languages approach: each node, check condition, if condition satisfied return.

in xslt select node xpath:

//rootnode/leafnode[@type='abc'] 

either result of contains node, or not. no need for-each @ all.

can use value of template variable or param main calling routine ?

no. variables , params strictly scoped. go out of scope once processing leaves parent element. constant, once declared cannot changed.

the way want here making template output desired value , capture in variable:

<xsl:template>   <xsl:variable name="returnvalue">     <xsl:call-template name="testtemplate" />   </xsl:variable> </xsl:template>  <xsl:template name="testtemplate">   <!-- following expression emits true or false -->   <xsl:value-of select="     count(//rootnode/leafnode[@type='abc']) gt; 0   " /> </xsl:template> 

two last hints:

  • avoid '//' operator @ costs. of time use not necessary
  • the first, top-most element in document not "root node", "document element"

this important distinction. "root node" comes before document element, xpath above should more (semantically):

/documentelement/leafnode ^------ *this* slash represents "root node" 

Comments

Popular posts from this blog

c++ - Convert big endian to little endian when reading from a binary file -

C#: Application without a window or taskbar item (background app) that can still use Console.WriteLine() -

unicode - Are email addresses allowed to contain non-alphanumeric characters? -