我有一个带有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> </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> </xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>