2012-03-07 23 views
6

में काउंटर वैरिएबल में वृद्धि और जांच करना मुझे काउंटर वैरिएबल असाइन करने और इसे बढ़ाने में थोड़ा कठिनाई हो रही है और फिर एक्सएसएलटी में एक निश्चित मूल्य की जांच कर रहा है।एक्सएसएलटी

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <xsl:variable name="empty_string"/> 
    <xsl:variable name="counter" select="0"/> 
<xsl:template match="/Collection"> 
     <xsl:for-each select="Content"> 
      <xsl:sort select="Html/root/Event/start_date" order="ascending"/> 
<xsl:variable name="isFutureEvent"> 
         <xsl:value-of select="syscom:isFutureDate(Html/root/Event/start_date)" /> 
        </xsl:variable> 

        <xsl:if test="Html/root/Event != $empty_string"> 
         <xsl:if test="$isFutureEvent='true'"> 
          <!-- Increment Counter --> 
          <xsl:value-of select="$counter + 1"/> 
          <!-- Test if Counter < 4 --> 
          <xsl:if test="$counter &lt; 3"> 
          <div class="media"> 
          <!-- Do stuff here --> 
         </div> 
          </xsl:if> <!-- End if for counter --> 
         </xsl:if> 
        </xsl:if> 
       <!--</xsl:when>--> 
      <!--</xsl:choose>--> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

लेकिन यह does not मेरी काउंटर बढ़ाने के लिए लग रहे हैं और न बाहर निकलने जब काउंटर हिट 3. इस पर कोई मदद: यहाँ मेरी कोड है?

उत्तर

11

एक्सएसएल में 'चर' वास्तव में स्थिरांक हैं - आप उनका मूल्य नहीं बदल सकते हैं। यह:

<xsl:value-of select="$counter + 1"/> 

सिर्फ उत्पादन $counter+1

का मूल्य छोरों आप प्रत्यावर्तन का उपयोग करना होगा ऐसा करने के लिए होगा - उदाहरण के लिए:

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

    <xsl:template name="loop"> 
    <xsl:param name="i"/> 
    <xsl:param name="limit"/> 
    <xsl:if test="$i &lt;= $limit"> 
     <div> 
     <xsl:value-of select="$i"/> 
     </div> 
     <xsl:call-template name="loop"> 
     <xsl:with-param name="i" select="$i+1"/> 
     <xsl:with-param name="limit" select="$limit"/> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:call-template name="loop"> 
      <xsl:with-param name="i" select="0"/> 
      <xsl:with-param name="limit" select="10"/> 
     </xsl:call-template> 
     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

हालांकि यह बेहतर है छोरों से बचने की कोशिश करने के लिए - सबसे में मामलों से बचने के लिए एक्सएसएल लिखा जा सकता है, लेकिन मुझे पूरा समाधान देने के लिए आप जो कुछ हासिल करने की कोशिश कर रहे हैं, उसे समझ में नहीं आता है।

7

मुझे एक ही समस्या है। मुझे लूप में वृद्धि मूल्य की आवश्यकता है। तो सबसे आसान तरीका सैक्सन शामिल था और उस मूल्य का उपयोग करें।

अगर आप सेक्सन 6.5.5

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
... 
xmlns:saxon="http://icl.com/saxon" 
extension-element-prefixes="saxon" 
version="3.0"> 

उपयोग करें यदि आप सेक्सन 9.4.0.4

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
... 
xmlns:saxon="http://saxon.sf.net/" 
extension-element-prefixes="saxon" 
version="3.0"> 

और उसके बाद का उपयोग आप बस सैक्सन चर का उपयोग कर सकते हैं:

<xsl:variable name="counter" select="0" saxon:assignable="yes"/> <!-- declare value --> 

<saxon:assign name="counter" select="$counter+1"/> <!-- increment value, you can do it in loop for example--> 

<xsl:value-of select="$counter"></xsl:value-of> <!-- print value --> 
+0

दुर्भाग्य से, सेक्सन वह XSLT संस्करण 2.0 तक ही सीमित है, तो आप नि: शुल्क संस्करण के साथ इस समाधान का उपयोग नहीं कर सकते हैं । – Hraban

2

में अगर कोई भी .net (XslCompiledTransform) का उपयोग करते समय ऐसा करना चाहता है तो आप

का उपयोग कर सकते हैं
<xsl:stylesheet ... xmlns:customCode="urn:customCode"> 

<msxsl:script language="VB" implements-prefix="customCode"> 
    <![CDATA[ 
    private mCounter As Integer 
    Public Function AddToCounter() As Boolean 
     mCounter += 1 
     Return True 
    End Function 
    Public Function GetCounter() As Integer 
     Return mCounter 
    End Function 
    ]]> 
</msxsl:script> 

तो फिर तुम एक फोन में जोड़ें "customCode: AddToCounter()", और के रूप में वे सिर्फ स्थिरांक की तरह हैं तो आप हम नहीं कर सकते xsl:variable अद्यतन इस <xsl:message><xsl:value-of select="customCode:GetCounter()" /> rows remaining.</xsl:message>

+0

अच्छा जवाब, बस इसे BizTalk – basvo

1

की तरह एक संदेश लिख सकते हैं। लेकिन हम dp:local-variables अपडेट कर सकते हैं, इसलिए dp:local-variable काउंटर को लूप शुरू करने से पहले शुरू किया गया है।

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <xsl:variable name="empty_string"/> 
    <xsl:template match="/Collection"> 
     <dp:set-local-variable name="'counter'" value="0"/> 
     <xsl:for-each select="Content"> 
      <dp:set-local-variable name="'counter'" value="dp:local-variable('counter')+1"/> 
      <xsl:sort select="Html/root/Event/start_date" order="ascending"/> 
      <xsl:variable name="isFutureEvent"> 
       <xsl:value-of select="syscom:isFutureDate(Html/root/Event/start_date)" /> 
      </xsl:variable> 

      <xsl:if test="Html/root/Event != $empty_string"> 
       <xsl:if test="$isFutureEvent='true'"> 

        <xsl:value-of select="dp:local-variable('counter')"/> 
        <!-- Test if Counter < 4 --> 
        <xsl:if test="dp:local-variable('counter') &lt; 3"> 
         <div class="media"> 
          <!-- Do stuff here --> 
         </div> 
        </xsl:if> 
        <!-- End if for counter --> 
       </xsl:if> 
      </xsl:if> 
      <!--</xsl:when>--> 
      <!--</xsl:choose>--> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
+0

के लिए xslt मानचित्र में उपयोग किया गया ऐसा प्रतीत होता है कि 'dp' नेमस्पेस आईबीएम डेटापावर का संदर्भ है ... जिसका आपके पास आपकी शीट में कोई संदर्भ नहीं है। साथ ही, आपकी स्टाइलशीट टैग बंद नहीं है। यहां तक ​​कि यदि स्टाइलशीट टैग को सही किया गया है, तो मुझे लगता है कि 'डीपी' नामस्थान आयात या आईबीएम उपकरण पर चलने के बिना काम नहीं करेगा ...? –

0

आप को पता है जहाँ आप एक के लिए-प्रत्येक पाश, आप में निर्मित स्थिति का उपयोग कर सकते() फ़ंक्शन में हैं चाहते हैं: हर बार जब पाश काउंटर से 1. ही अपडेट हो जाएगा यह प्रयास करें चलाया जाता है।

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/Collection"> 
     <xsl:for-each select="Content"> 
      <xsl:if test="position() &lt; 3"> 
       <!-- Do this for nodes 1, 2 and 3 --> 
      </xsl:if> 
      <!-- Do this for every node --> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
0

मेरे मामले में मैं शिपमेंट में बक्से के कुल की जरूरत है, इस मदद की

<xsl:for-each select="ShippingConfirmation/Details/LicensePlates/LicensePlate"> 
      <xsl:if test="position()=last()"> 
       <xsl:value-of select="position()"/> 
      </xsl:if> 
    </xsl:for-each>