【问题标题】:XSL printing linebreak but leave out last line breakXSL 打印换行符但省略了最后一个换行符
【发布时间】: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 代码才能给出合理的建议(我在重复自己)。
  • 一个可能的建议:将问题定义更改为在每条记录之前而不是在每条记录之后输出换行符可能更容易。然后你只需要抑制第一个而不是最后一个,这可能是一个更容易实现的测试。

标签: xml xslt


【解决方案1】:

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

我会坚持这些陈述,因为这里还有很多其他没有意义的事情。现在,假设您的 real 输入如下所示:

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

【讨论】:

  • 现在我要把我想的水弄得一团糟,不知道我问的能不能做到。假设我有 2 条姓氏为 Flynn 的额外员工记录和一个名为 Fulltime 的额外字段
  • 新的 XML 代码和预期结果发布到原始帖子.. 以为我能够完成第二部分,但没有任何运气......提前感谢您提供的任何帮助
  • @user3266089 我在上面的答案中添加了一个修改版本。附言为什么您的 XML 输入仍然不正确(没有根元素、虚假破折号),即使您已经修改了它?
  • 感谢您的帮助 - 如果我必须让我的结果看起来更像这样会怎样
  • 因此,史密斯记录之一被更改为全职真实,并且对于每个史密斯发现我必须按原样输出大写的姓氏,并且对于每个全职我必须输出较低的姓氏 - 全职 - OriginalHireDt 所以我需要为匹配 Smith 并且是 Fulltime 的名称添加行。我似乎无法正确理解逻辑 - 我可以生成两条记录,但它们最终在一行上,因为 if 语句都匹配并且空格是直到最后一个 if 语句关闭之后才应用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多