2014-02-19 46 views
0

我需要一些關於XSLT的幫助。計算XSLT1.0中的行數

我得到一個XML文件,我需要在文件中報告一些數據兩次,soem數據需要過濾掉。

並在頁腳上我需要準確報告文件中有多少行。

是否有人可以幫助我在這裏感謝

這裏是我的XML:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
<ns0:File xmlns:ns0="file"> 

    <ns0:Records> 
    <ns0:Main> 
     <ns0:Info> 
     <ns0:InternalCode>1</ns0:InternalCode> 
     <ns0:Name>test1</ns0:Name> 
     <ns0:Factor>2.000000000000</ns0:Factor> 
     <ns0:Type>a</ns0:Type> 
     </ns0:Info> 
    </ns0:Main> 
<ns0:Main> 
     <ns0:Info> 
     <ns0:InternalCode>2</ns0:InternalCode> 
     <ns0:Name>test2</ns0:Name> 
     <ns0:Factor>10.000000000000</ns0:Factor> 
     <ns0:Type>c</ns0:Type> 
     </ns0:Info> 
    </ns0:Main> 
<ns0:Main> 
     <ns0:Info> 
     <ns0:InternalCode>3</ns0:InternalCode> 
     <ns0:Name>test3</ns0:Name> 
     <ns0:Factor>13.000000000000</ns0:Factor> 
     <ns0:Type>b</ns0:Type> 
     </ns0:Info> 
    </ns0:Main> 
<ns0:Main> 
     <ns0:Info> 
     <ns0:InternalCode>4</ns0:InternalCode> 
     <ns0:Name>test4</ns0:Name> 
     <ns0:Factor>1.000000000000</ns0:Factor> 
     <ns0:Type>a</ns0:Type> 
     </ns0:Info> 
    </ns0:Main> 
<ns0:Main> 
     <ns0:Info> 
     <ns0:InternalCode>5</ns0:InternalCode> 
     <ns0:Name>test5</ns0:Name> 
     <ns0:Factor>1.000000000000</ns0:Factor> 
     <ns0:Type>f</ns0:Type> 
     </ns0:Info> 
    </ns0:Main> 
    </ns0:Records> 

    <ns0:Footer> 
    <ns0:Time>10:54:40</ns0:Time> 
    <ns0:NumberOfRecords>5</ns0:NumberOfRecords> 
    </ns0:Footer> 

</ns0:File> 

這裏是我的XSLT:

<?xml version="1.0" encoding="iso-8859-1"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="file"> 

     <xsl:output method="text" 
     encoding="ASCII"/> 

     <xsl:template match="ns0:Main"> 

<xsl:variable name="substractone"> 
     <xsl:value-of select="ns0:Info/ns0:Factor-1"/> 
    </xsl:variable> 

     <xsl:if test=" ns0:Factor !=0 and ns0:Type !='c' and $substractone !=0 "> 


      <xsl:choose> 
      <xsl:when test="ns0:Type = 'a'"> 

       <xsl:value-of select="ns0:InternalCode"/> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Name"/> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Factor"/> 
         <xsl:text> 
    </xsl:text> 
    <!-- repeat in a new line --> 
       <xsl:value-of select="ns0:InternalCode"/> 

       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Name"/> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Factor"/> 
         <xsl:text> 
    </xsl:text> 

      </xsl:when> 

      <xsl:otherwise> 


       <xsl:value-of select="ns0:InternalCode"/> 

       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Name"/> 
       <xsl:text>,</xsl:text> 
       <xsl:value-of select="ns0:Factor"/> 
         <xsl:text> 
    </xsl:text> 
      </xsl:otherwise> 
      </xsl:choose> 


     </xsl:if> 

     </xsl:template> 

     <xsl:template match="ns0:Footer"> 
     <!--Footer row--> 
     <xsl:text> 
    </xsl:text> 

     <xsl:text>*</xsl:text> 
     <xsl:value-of select="ns0:NumberOfRecords"/> 



     <!--record total--> 


     <xsl:apply-templates/> 

     </xsl:template> 
     <xsl:template match="text()"/> 

    </xsl:stylesheet> 

正如你可以看到NS0:NumberOfRecords會在這裏返回5,但實際上這個文件有4行(過濾出type = c,每行爲= 2行)

有人可以告訴我如何才能正確地獲取文件中的行數?

+0

你明明看着我的答案(因爲你在你的代碼,我指出糾正錯誤)。你介意告訴我它是否解決了你的問題?順便說一下,請接受這裏的答案之一:http://stackoverflow.com/questions/12743828/how-to-do-square-root-in-xslt-1-0 –

回答

0

正如你可以看到NS0:NumberOfRecords將返回5在這裏,但實際上該文件得到了6行(過濾掉類型= c和2行每類= A)

代替

<xsl:value-of select="ns0:NumberOfRecords"/> 

<xsl:value-of select="count(//ns0:Type[. != 'c']) + count(//ns0:Type[. = 'a'])"/> 

然後,將得到以下的輸出:

*6 

與XML和代碼的其他問題:

  • 沒有你xsl:ifxsl:choose的計算結果爲 「真」。因此,唯一輸出的是記錄總數。這是因爲上下文

上下文我的意思是以下。您的模板匹配ns0:Main元素,因此這是樹中「您的」位置。如今,像這樣的一行:

<xsl:if test=" ns0:Factor !=0 and ns0:Type !='c' "> 

實際上看起來的ns0:Factorns0:Type元素是ns0:Main元素的直接孩子。但是,如你所知,沒有這樣的元素。相反,ns0:Factorns0:Typens0:Info的子女。你必須考慮到這樣一個事實:

<xsl:if test=" ns0:Info/ns0:Factor !=0 and ns0:Info/ns0:Type !='c' "> 

或者,也許它可能是更容易更改模板匹配:如果你做任何的這些變化

<xsl:template match="ns0:Main/ns0:Info"> 

,輸出爲:

1,test1,1.000000000000 
1,test1,1.000000000000 
3,test3,13.000000000000 
4,test4,1.000000000000 
4,test4,1.000000000000 
5,test5,1.000000000000 

*6 
  • 你沒有聲明XSLT命名空間(xmlns:xsl="http://www.w3.org/1999/XSL/Transform")在你的樣式表中
  • 在您輸入XML,還有盈餘</ns0:Records>元素過早地關閉,防止文件被合式
+0

非常感謝大副。然而這只是簡單的例子,我有一些額外的過濾器基於在ns0:Main下聲明的變量。我需要再次在ns0:Footer下再次聲明它們。但我不認爲重新分拆他們將在頁腳上工作,因爲每個變量都需要ns0中的數據:Main爲每個條目 – ken

+0

對於將來的問題,在簡化XML數據時,確保只消除對你的問題沒有貢獻。在XSLT中沒有這樣的「過濾器」。你是什​​麼意思?沒有看到實際的樣式表,不可能說你的方法是否「正確」。 –

+0

或者也許我可以宣佈footerwithin主,但如何cna我只是讓它出現一次? – ken