XSL: печать делителя путем проверки переменных - PullRequest
0 голосов
/ 07 февраля 2012

Я новичок в XSL и хочу сделать что-то вроде

var oldvalue= '' 
for each
   get currentvalue
   if (oldvalue != currentvalue)
   {
         print divider
         oldvalue = currentvalue
    }      
end for  

Я пробовал это с

<xsl:variable name="oldname" select="name" /> 

<xsl:for-each select="myxpathstring">
  <xsl:choose>
      <xsl:when test="$newname = $newname">
        <xsl:variable name="oldname" select="$newname" />
        <div class='divider'>divider stuff </div>
       </xsl:when>

      <xsl:otherwise>No</xsl:otherwise>
 </xsl:choose>

</xsl:for-each>

Но это не работает, потому что я могу 't обновить переменную oldname.У кого-нибудь есть решение?

Полный XSL (с JSP-параметрами, потому что я генерирую XSL динамически)

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<xsl:variable name="counter" select="count(<%= request.getParameter("xpath")%>)" />
<div id='counter' class='ui-state-highlight ui-corner-all'><p><span style="float: left; margin-right: .3em;" class="ui-icon ui-icon-info"></span><xsl:value-of select="$counter"/> schema's gevonden</p></div>
<div class="page_navigation ui-widget-header ui-corner-all"></div>
<ul id='schemeslist' class="content">
<xsl:for-each select="<%= request.getParameter("xpath")%>"><!-- filter on sports //scheme[ (sports/sport ='Fietsen') and (planduration=12 or planduration=16)]-->
<xsl:sort select="name"/>

     <!-- ////////////////// -->
      <!--  print divider if name is new -->
     <!-- ////////////////// -->

    <li class='scheme' id='scheme'>

    <div class='schemeSports'>
    <!-- <xsl:for-each select="sports/sport">
            <xsl:value-of select="."/> 
    </xsl:for-each> -->
    <xsl:value-of select="sport"/>
</div>
<xsl:variable name="theid" select="@id" /> 





<div class='schemeName'><xsl:value-of select="name"/></div>
<div class='planDuration'><xsl:value-of select="planduration"/></div>
<div class='fitnessLevel'><xsl:value-of select="fitnesslevel"/></div>
<div class='order'> 
    <xsl:if test="price != ''"><xsl:value-of select="price"/>euro</xsl:if>

 <button class='more' onClick='showInfo("{$theid}")' id='{$theid}'>MEER</button> <button class='buy' onClick='window.location = "buy.html?ID={$theid}"'>KOOP</button>
 </div>

</li>
</xsl:for-each>



</ul>
<div style='clear:both'></div>
<div class="page_navigation ui-widget-header ui-corner-all"></div>

</xsl:template>
</xsl:stylesheet>

, и вот пример полного xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<schemes lang='nl-BE'>
 <scheme id='5E47B7E9'>
  <sport>Fietsen</sport>
<author>Energy Lab</author>
<name>Voorbereiding op de Ronde van Vlaanderen</name>
<planduration>16</planduration>
<fitnesslevel>Beginner</fitnesslevel>
<frequency>1-3</frequency>
<longtraining></longtraining>
<rollers>Ja</rollers>
<price>12</price>
<description>
  <![CDATA[...]]>
</description>
  </scheme>
<scheme id='5E47B7E9'>
  <sport>Triatlon</sport>

<author>Energy Lab</author>
<name>Voorbereiding op de Ronde van Vlaanderen</name>
<planduration>16</planduration>
<fitnesslevel>Expert</fitnesslevel>
<frequency>1-3</frequency>
<longtraining></longtraining>
<rollers>Ja</rollers>
<price>12</price>
<description>
  <![CDATA[...]]>
</description>
  </scheme>
<scheme id='5E47B7E9'>
<sport>Fietsen</sport>

<author>Energy Lab</author>
<name>Voorbereiding op een Triatlon</name>
<planduration>24</planduration>
<fitnesslevel>Beginner</fitnesslevel>
<frequency>1-3</frequency>
<longtraining></longtraining>
<rollers>Ja</rollers>
<price>48</price>
<description>
  <![CDATA[...]]>
</description>
  </scheme>
</schemes>

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Если я правильно понимаю XSLT , вы должны использовать muenchian grouping .Прочитайте эту статью , чтобы узнать, как работает этот метод.

XML:

<?xml version="1.0" encoding="UTF-8"?>
<schemes lang='nl-BE'>
    <scheme id='5E47B7E9'>
        <sport>Fietsen</sport>
        <author>Energy Lab</author>
        <name>Voorbereiding op de Ronde van Vlaanderen</name>
        <planduration>16</planduration>
        <fitnesslevel>Beginner</fitnesslevel>
        <frequency>1-3</frequency>
        <longtraining></longtraining>
        <rollers>Ja</rollers>
        <price>12</price>
        <description><![CDATA[...]]></description>
    </scheme>
    <scheme id='5E47B7E9'>
        <sport>Triatlon</sport>
        <author>Energy Lab</author>
        <name>Voorbereiding op de Ronde van Vlaanderen</name>
        <planduration>16</planduration>
        <fitnesslevel>Expert</fitnesslevel>
        <frequency>1-3</frequency>
        <longtraining></longtraining>
        <rollers>Ja</rollers>
        <price>12</price>
        <description><![CDATA[...]]></description>
    </scheme>
    <scheme id='5E47B7E9'>
        <sport>Fietsen</sport>
        <author>Energy Lab</author>
        <name>Voorbereiding op een Triatlon</name>
        <planduration>24</planduration>
        <fitnesslevel>Beginner</fitnesslevel>
        <frequency>1-3</frequency>
        <longtraining></longtraining>
        <rollers>Ja</rollers>
        <price>48</price>
        <description><![CDATA[...]]></description>
    </scheme>
</schemes>

XSLT:

Я заменил первый тег jspс точкой и убрал второе, потому что я понятия не имею, чего вы пытаетесь достичь.Я не рекомендую динамический *.xsl.Вам лучше поместить эту информацию в input.xml и запросить ее с помощью xpath.

<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='1.0'
                xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

<xsl:output method='xml' indent='yes' omit-xml-declaration='yes'/>

<xsl:key name='schemata' match='scheme' use='name'/>

<xsl:template match='scheme'>
    <li class='scheme' id='scheme'>
        <div class='schemeSports'>
            <xsl:value-of select="sport"/>
        </div>
        <xsl:variable name="theid" select="@id"/>
        <div class='schemeName'>
            <xsl:value-of select="name"/>
        </div>
        <div class='planDuration'>
            <xsl:value-of select="planduration"/>
        </div>
        <div class='fitnessLevel'>
            <xsl:value-of select="fitnesslevel"/>
        </div>
        <div class='order'>
            <xsl:if test="price != ''">
                <xsl:value-of select="price"/>
                euro
            </xsl:if>
            <button class='more' onClick='showInfo("{$theid}")' id='{$theid}'>MEER</button>
            <button class='buy' onClick='window.location = "buy.html?ID={$theid}"'>KOOP</button>
        </div>
    </li>
</xsl:template>

<xsl:template match='/schemes'>
    <xsl:variable name="counter" select="count(.)"/> <!-- jsp -->
    <div id='counter' class='ui-state-highlight ui-corner-all'>
        <p>
            <span style="float: left; margin-right: .3em;" class="ui-icon ui-icon-info"/>
            <xsl:value-of select="$counter"/>
            <xsl:text> schema's gevonden</xsl:text>
        </p>
    </div>
    <div class="page_navigation ui-widget-header ui-corner-all"/>
    <ul id='schemeslist' class="content">
        <!-- muenchian grouping -->
        <xsl:for-each select='scheme[generate-id() = generate-id(key("schemata", name)[1])]'>
            <xsl:sort select='name'/>
            <xsl:if test='position() != 1'>
                <div class='divider'/>
            </xsl:if>
            <xsl:apply-templates select='key("schemata", name)'/>
        </xsl:for-each>
    </ul>
    <div style='clear:both'/>
    <div class="page_navigation ui-widget-header ui-corner-all"/>
</xsl:template>

</xsl:stylesheet>

Результат:

<div id="counter" class="ui-state-highlight ui-corner-all">
  <p><span style="float: left; margin-right: .3em;" class="ui-icon ui-icon-info"/>1 schema's gevonden</p>
</div><div class="page_navigation ui-widget-header ui-corner-all"/><ul id="schemeslist" class="content">
  <li class="scheme" id="scheme">
    <div class="schemeSports">Fietsen</div>
    <div class="schemeName">Voorbereiding op de Ronde van Vlaanderen</div>
    <div class="planDuration">16</div>
    <div class="fitnessLevel">Beginner</div>
    <div class="order">12
                euro
            <button class="more" onClick="showInfo(&quot;5E47B7E9&quot;)" id="5E47B7E9">MEER</button><button class="buy" onClick="window.location = &quot;buy.html?ID=5E47B7E9&quot;">KOOP</button></div>
  </li>
  <li class="scheme" id="scheme">
    <div class="schemeSports">Triatlon</div>
    <div class="schemeName">Voorbereiding op de Ronde van Vlaanderen</div>
    <div class="planDuration">16</div>
    <div class="fitnessLevel">Expert</div>
    <div class="order">12
                euro
            <button class="more" onClick="showInfo(&quot;5E47B7E9&quot;)" id="5E47B7E9">MEER</button><button class="buy" onClick="window.location = &quot;buy.html?ID=5E47B7E9&quot;">KOOP</button></div>
  </li>
  <div class="divider"/>
  <li class="scheme" id="scheme">
    <div class="schemeSports">Fietsen</div>
    <div class="schemeName">Voorbereiding op een Triatlon</div>
    <div class="planDuration">24</div>
    <div class="fitnessLevel">Beginner</div>
    <div class="order">48
                euro
            <button class="more" onClick="showInfo(&quot;5E47B7E9&quot;)" id="5E47B7E9">MEER</button><button class="buy" onClick="window.location = &quot;buy.html?ID=5E47B7E9&quot;">KOOP</button></div>
  </li>
</ul><div style="clear:both"/><div class="page_navigation ui-widget-header ui-corner-all"/>
0 голосов
/ 07 февраля 2012

Создайте функцию, которая возвращает новое значение, принимая в качестве параметров старое значение и список значений в myxpathstring.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...