xsl-list
[Top] [All Lists]

RE: [xsl] Navigation / node-set

2008-05-14 10:29:12
You basically need to collapse the "matching" condition into a predicate so
you can say

<xsl:for-each select="preceding-sibling::*[PRED][1]">

That's easy in XSLT 2.0 where you can put your code into a function and call
the function from your predicate:

<xsl:for-each select="preceding-sibling::*[f:matching(.)][1]"> 

<xsl:function name="f:matching" as="xs:boolean">
  <xsl:param name="node" as="node()"/>
       <xsl:variable name="wx">
        <xsl:if test="contains(substring(kbase/title, 1, 2),$witem)">
            <xsl:value-of select="(@id)"/>
         </xsl:if>
        </xsl:variable>
       <xsl:sequence select="string-length($wx) > 0">
</xsl:function>

But in fact this can all be collapsed into a simple XPath expression anyway:

<xsl:for-each select="preceding-sibling::*[contains(substring(kbase/title,
1, 2),$witem) and string-length(@id)>0][1]">

You might not need the (string-length(@id)>0) part of the condition.

Also I strongly suspect that contains(substring(kbase/title, 1, 2),$witem)
can be rewritten

substring(kbase/title, 1, 2) = $witem

or possibly even

starts-with(kbase/title, $witem)

Michael Kay
http://www.saxonica.com/ 




-----Original Message-----
From: nenad(_at_)njconsulting(_dot_)de 
[mailto:nenad(_at_)njconsulting(_dot_)de] 
Sent: 14 May 2008 18:07
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Navigation / node-set

Hi, my problem is that with this code
instead of displaying the first matching preceding-sibling I 
display all of them that precede.
How I can diplay just the first matching preceding-sibling?
Thanks



<xsl:template name="randomsearch">
    <xsl:variable name="selcat" select="$SelectCategories"/>
    <xsl:variable name="selran" select="$SearchedString"/>
    <xsl:variable name="filart" select="$FilterArticles"/>
    <xsl:variable name="showsingle" select="$ShowSingleTechno"/>


      <xsl:variable name="witem">

        <xsl:for-each select="(./kbase//title)">
          <xsl:value-of select="substring(., 1,  
2)"/></xsl:for-each></xsl:variable>



    <xsl:for-each select="preceding-sibling::*">
      <xsl:variable name="wx">
        <!--<xsl:value-of select="substring(kbase/title, 1, 2)"/>;;-->

        <xsl:if test="contains(substring(kbase/title, 1, 2),$witem)">
          <!--<xsl:if test="position() != last() ">-->
          <xsl:value-of select="(@id)"/>
        </xsl:if>
        <!--</xsl:if>-->
        <!---->
      </xsl:variable>


      <xsl:if test="string-length($wx) > 0">
        <!-- <xsl:if test="position()=1">-->
        <b>
          <i>
            <a>
              <xsl:attribute name="href">
                http://localhost:1313/?ShowSingleTechno=<xsl:value-of
 select="$wx"/>&amp;SelectCategories=<xsl:value-of
 select="$selcat"/>&amp;SearchedString=<xsl:value-of
 select="$selran"/>&amp;FilterArticles=<xsl:value-of 
select="$filart"/>
              </xsl:attribute>PREVIOUS
            </a>
           
          </i>
        </b>
      </xsl:if>
    </xsl:for-each>

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>