2011-05-17 122 views
0

嗨夥計, 我有這個相當笨拙的xslt,我用它將SOAPUI測試用例轉換爲更易讀的格式。目前,它使用以下使用位置計數節點 - 有時枚舉從0開始而不是1

<xsl:value-of select="position()-3"/>

我的問題有時測試用例枚舉從0開始,有時是從1開始。我不明白爲什麼會這樣列舉了測試用例?這與位置選擇器的實現方式有關嗎?有沒有更好的方法來計算節點的實例?

非常感謝,

理查德

以下是全部的代碼 - SANS造型。

`

<!-- Edited by XMLSpy® --> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:con="http://eviware.com/soapui/config"> 
    <xsl:output method="html" encoding ="utf-8"/> 
    <xsl:template match="/"> 
     <html> 
     <head> 
      <script type="text/javascript"> 
      function toggleDiv(divid){ 
       var ele = document.getElementById(divid); 

       if(ele.style.display == 'none') 
        { 
         ele.style.display = 'block'; 
        } 
       else 
        { 
         ele.style.display = 'none'; 
        } 
       } 
      </script> 

      <style type="text/css"></style> 

     </head> 

     <body> 

      <xsl:apply-templates/> 

      <div class="help">This report is generated automatically by a scheduled job running on Richard Fortune's machine. The SOAPUI project files it references are located in sourcecontrol SVN (https://svn.xxx.xxxxxx.com/svn/network/TEST). These reports are generated daily as the projects they reference are subject to change.</div> 

     </body> 
     </html> 

    </xsl:template> 

    <xsl:template match="con:soapui-project"> 
    <div><h1>Project Name : <xsl:value-of select="@name"/></h1></div> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="con:testSuite">  

    <xsl:if test="con:description=''"> 
       <p class="warn"> (RICHARD - PLEASE PROVIDE A DESCRIPTION!!)</p> 
    </xsl:if>  
     <div id="content" onmousedown="toggleDiv('{position()}');"><h2 class="ex">TestSuite: <xsl:value-of select="@name"/></h2></div> 
     <br> 
     <p class="descSuite"><b>Suite Description: </b><xsl:value-of select="con:description"/></p> 
     </br> 

     <div style="display:none" id="{position()}"><xsl:apply-templates /> 
     </div> 
    </xsl:template> 


    <xsl:template match="con:testCase"> 

     <ul> 
      <li class="tc"><b> 
      (#<xsl:value-of select="position()-3"/>) Testcase: </b><xsl:value-of select="@name"/> 
      </li> 

      <xsl:if test="con:description=''"> 
      <p class="warn">(Gentle reminder Richard - PLEASE PROVIDE A DESCRIPTION!!)</p> 
      </xsl:if> 

      <p class="descTc"> 
      <strong><i>Description:</i></strong> <xsl:value-of select="con:description"/> 
      </p> 
      <ol class="step"> 
      <xsl:for-each select="con:testStep"><li>TestStep: <xsl:value-of select="@name"/> </li></xsl:for-each> 
      </ol> 

     </ul> 
     <xsl:apply-templates /> 

    </xsl:template> 


    <xsl:template match="*"></xsl:template> 


    </xsl:stylesheet> 

`

+0

這將是有用的你的XML輸入樣本。 – 2011-05-17 06:47:41

+0

請編輯你的問題並提供一個完整的(但儘可能短)的XML文檔。同時提供你得到的錯誤結果並解釋應該是什麼結果。我想我知道問題可能是什麼,但我不想花時間去猜測。 – 2011-05-17 13:08:00

回答

1

這裏是你將如何使用<xsl:number>,這是更有效的比使用count()

<li class="tc"> 
    <b>(#<xsl:number/>) Testcase: </b><xsl:value-of select="@name"/> 
</li> 

就這麼簡單!默認情況下,<xsl:number>統計相同節點類型(在本例中爲元素)的節點以及與上下文節點相同的元素名稱......我相信這正是您想要的。所以它會計數<con:testCase>元素。

+0

嗨拉爾斯,我首先嚐試了這一點,它完美的「開箱即用」。感謝那! – 2011-05-17 20:19:00

2

我建議你使用count()

<xsl:value-of select="count(preceding-sibling::*)+1"/> 

這將返回該節點關於它的所有兄弟元素的當前位置(基於1) 。

position()取決於上下文可能不是正確的方法。

+1

*'這將返回節點相對於其所有兄弟節點(基於1)的當前位置。'* - 實際上就其所有前面的兄弟元素**而言。這是一個關鍵的區別,因爲OP使用'position()'的問題是它計算了所有前面的兄弟節點,包括那些不是元素的節點,比如空白文本節點。 – LarsH 2011-05-17 16:38:34

+0

是的,這就是爲什麼'計數'更好。我提供的XPath只會計算以前的兄弟元素。 OP正在尋找什麼? – 2011-05-17 17:26:05

+0

我相信你是正確的OP正在尋找什麼,你的XPath做對了。我只是指出你的描述「[尊重所有兄弟姐妹」是誤導性的;我相信你的意思是「[尊重其所有同胞**元素**」(即排除兄弟文本節點,評論等)。 – LarsH 2011-05-17 18:34:36

1

position()的問題是它可以(並且經常)包含你不期望的節點,比如文本或者甚至是空白節點,如果不管讀什麼XML保存它。

根據您的具體要求,您可以計算前面的兄弟姐妹的數量(如所描述的@empo),或者可能需要查看<xsl:number>指令。

+0

好點;但是術語的使用是不正確的和令人困惑的:與你的回答暗示的相反,術語* elements *不會**包含文本或空白節點;而*文本節點* ** do **包含空白節點。 – LarsH 2011-05-17 16:36:01

+0

+1表示'',通常比'count()'效率更高。 -1用於不正確的術語。 – LarsH 2011-05-17 16:40:25

+0

是的,是的。我責備.NET,當我搜索元素時,我習慣使用'SelectSingleNode';我知道它當然也可以返回其他節點,但是我陷入了考慮節點/元素的壞習慣。舊習難改。我會修改答案。 – Flynn1179 2011-05-17 22:23:31