计算XSLT 1.0中的行数

时间:2014-02-19 11:28:10

标签: xml xslt xslt-1.0

我需要一些关于XSLT的帮助。

我有一个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行= a)

有人可以告诉我如何正确获取文件中的行数吗?

2 个答案:

答案 0 :(得分:0)

  

正如你所看到的,ns0:NumberOfRecords在这里会返回5,但实际上这个文件有6行(过滤掉type = 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都没有评估为“true”。因此,唯一输出的是记录总数。这是因为 context

根据上下文,我的意思是以下内容。您的模板与ns0:Main元素匹配,因此它是树中的“您的”位置。现在,像这样的一行:

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

实际上会查找ns0:Factor元素 immediate 元素的ns0:Typens0: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>元素过早关闭并阻止文件格式正确

答案 1 :(得分:0)

其实我发现了Number of rows in a flat file transformed from xml using xslt

这将算不上。换行并告诉你文件中有多少行: