XSL打印换行,但遗漏了最后一行

时间:2014-02-03 13:56:18

标签: xml xslt

我有一个xml文档,让我们说300条记录..我正在浏览每条记录,如果符合某些条件,我会在每条记录后将数据写入带有换行符的文本文件。除了在打印最后一条记录之后添加空间并且这导致接收文件的系统出错之外,我的工作是预期的。我不能使用position作为我的xml中的最后一条记录并不总是符合标准。是否有任何想法如何为除最后一场比赛之外的每条记录包含一个换行符?

<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Jones</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>  
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Smith</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>  
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Smith</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>  
    </Group>
</Worker>

XSLT

<xsl:strip-space elements="Worker_Sync"/>    
<xsl:template match="Worker_Sync">

            <xsl:apply-templates/>

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


    <xsl:for-each select="Group[Field[@name = 'LastName'] = 'Smith']">
        <xsl:value-of select="upper-case(Field[@name = 'LastName'])"/>
        <xsl:value-of select="position()"/>, last
        <xsl:value-of select="last()"/><br/>
    </xsl:for-each>

</xsl:template>

新XML

<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Jones</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>
        <Field name="Fulltime">False</Field>
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Smith</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>
        <Field name="Fulltime">False</Field>
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Smith</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>
        <Field name="Fulltime">False</Field>
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Jones</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>
        <Field name="Fulltime">True</Field> 
    </Group>
</Worker>
<Worker>
    - <Group name="Employee Changes">
        <Field name="LastName">Jones</Field> 
        <Field name="OriginalHireDt">03211977</Field> 
        <Field name="ParticipationDt">05011977</Field>
        <Field name="Fulltime">False</Field>
    </Group>
</Worker>

预期结果 史密斯(换行) 史密斯(换行) 琼斯 - 全职(没有换行)

所以我想选择一个姓史密斯的人,只写一个姓氏和任何一个Fulltime = true的人写下他们的姓氏和Fulltime这个词...我想我能解决第二个问题曾经有过第一件作品,但事实并非如此......

1 个答案:

答案 0 :(得分:1)

  

我正在浏览每条记录,如果满足某些条件,我就是   在每条记录之后将数据写入带有换行符的文本文件   ...
  我想要的是能够选择最后两名员工   给史密斯起名,并将它们放在我可以识别出来的结果集中   最后一项使用position()。

我会坚持这些陈述,因为这里有很多其他的东西是没有意义的。现在,假设您的真实输入如下所示:

<Worker_Sync>
    <Worker>
        <Group name="Employee Changes">
            <Field name="LastName">Jones</Field> 
            <Field name="OriginalHireDt">03211977</Field> 
            <Field name="ParticipationDt">05011977</Field>  
        </Group>
    </Worker>
    <Worker>
        <Group name="Employee Changes">
            <Field name="LastName">Smith</Field> 
            <Field name="OriginalHireDt">03211977</Field> 
            <Field name="ParticipationDt">05011977</Field>  
        </Group>
    </Worker>
    <Worker>
        <Group name="Employee Changes">
            <Field name="LastName">Smith</Field> 
            <Field name="OriginalHireDt">03211977</Field> 
            <Field name="ParticipationDt">05011977</Field>  
        </Group>
    </Worker>
</Worker_Sync>

您可以使用以下样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/">
    <xsl:for-each select="Worker_Sync/Worker/Group[Field[@name='LastName']='Smith']">
        <xsl:value-of select="upper-case(Field[@name='LastName'])"/>
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

生成以下文本输出:

SMITH
SMITH

请注意,最后一个SMITH之后没有换行符。


修改 如果我理解你修改后的要求,请尝试:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8"/>

<xsl:template match="/">
    <xsl:for-each select="Worker_Sync/Worker/Group[Field[@name='LastName']='Smith' 
                                                   or 
                                                   Field[@name='Fulltime']='True']">
        <xsl:value-of select="upper-case(Field[@name='LastName'])"/>
        <xsl:if test="Field[@name='Fulltime']='True'">
            <xsl:text> - Fulltime</xsl:text>
        </xsl:if>
        <xsl:if test="position()!=last()">
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>