【发布时间】:2014-02-06 05:47:49
【问题描述】:
我有一个 xml 文档,假设有 300 条记录。我正在遍历每条记录,如果满足某些条件,我将在每条记录后将数据写入文本文件并带有换行符。我有这个预期的工作,除了在打印最后一条记录后添加了一个空格,这导致系统接收文件时出错。我不能使用位置,因为我的 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>
预期结果 史密斯(换行) 史密斯(换行) 琼斯 - 全职(无换行)
所以我想选择姓 Smith 的任何人,只写他们的姓氏,选择 Fulltime = true 的任何人,写下他们的姓氏和单词 Fulltime... 我想我可以解决第二个问题一块我有第一块,但事实并非如此..
【问题讨论】:
-
XSL 不会输出任何你没有告诉它输出的东西。您没有向我们提供足够的信息来给您具体的建议,但答案是重写您的样式表逻辑,使其不会那样做。或者修复其他应用程序,使其具有忽略该换行符所需的智能。如果你想让我们多说什么,你必须给我们一些具体的工作;读心术不提供免费服务。
-
欢迎来到 StackOverflow。请使用您的输入 XML、您的 XSLT 代码、您期望的 XML 输出以及您实际得到的输出来扩展您的问题。
-
“我不能使用位置,因为我的 xml 中的最后一条记录并不总是符合标准” - 这完全取决于样式表结构 - 如果您只是将模板应用于所有节点然后使用 @987654324 @ 检查模板内部以确定节点是否“符合标准”,然后是,但如果您使用谓词仅选择“符合标准”的节点,并且仅在这些节点上选择
apply-templates(或for-each)然后你可以使用position()。 -
我们绝对需要查看 XML 和 XSLT 代码才能给出合理的建议(我在重复自己)。
-
一个可能的建议:将问题定义更改为在每条记录之前而不是在每条记录之后输出换行符可能更容易。然后你只需要抑制第一个而不是最后一个,这可能是一个更容易实现的测试。