计数XSLT1.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,每个type=a有2行)

有人能告诉我如何正确地得到文件中的行数吗?

正如你所看到的,ns0:NumberOfRecords在这里会返回5行,但实际上这个文件有6行(过滤掉type=c,每个type=a有2行)

而不是

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

写入

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

然后,您得到以下输出:

*6

XML和代码的其他问题:

  • 您的xsl:ifxsl:choose均未评估为"true"。因此,唯一输出的就是记录的总数。这是因为上下文

上下文是指以下内容。您的模板匹配ns0:Main元素,因此这是树中的"您"位置。现在,像这样的一行:

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

实际上查找CCD_ 4和CCD_ 5元素,它们是CCD_。但是,正如你所知,不存在这样的元素。相反,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>元素过早关闭,使文件格式不正确

实际上,我在使用xslt 从xml转换而来的平面文件中发现了这个行数

这将计算换行次数,并告诉您文件中有多少行:

相关内容

  • 没有找到相关文章

最新更新