XSL打印线路破坏了最后一行休息



我有一个带有300个记录的XML文档。.我正在浏览每个记录,如果满足某些条件,则在每个记录后将数据写入带有lineFeed的文本文件。除了在上一个记录打印后,添加了一个空间,这会导致收到文件的系统错误,这是我的预期工作。我无法将位置作为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>

预期结果史密斯(lineFeed)史密斯(lineFeed)琼斯 - 全日制(无线馈送)

所以我想选择任何姓氏史密斯的人,只写下姓氏,所有的人都有全职= true,并写下他们的姓氏和全职词...我想我能够解决第二个我有第一件作品,但事实并非如此。

我正在遍历每个记录,如果满足某些条件,我是 在每个记录后将数据写入带有linefeed的文本文件。
...
我想要的是能够选择两名员工 命名史密斯,并将它们放在结果集中,我可以识别 使用位置()的最后一项。

我将坚持这些陈述,因为这里还有很多其他事情没有意义。现在,假设您的真实输入看起来像这样:

<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

请注意,最后一个史密斯之后没有线。


编辑:如果我正确理解您的修订要求,请尝试:

<?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>

最新更新