使用XSLT 1.0从XML转换为CSV,获得空行
我有以下XML文件(为了说明起见,我在这里减少了XML和XSLT;在真正的XML文档中,有更多我关心的数据,也有更多我不关心的数据,通常有十几个使用XSLT 1.0从XML转换为CSV,获得空行,xml,csv,xslt-1.0,Xml,Csv,Xslt 1.0,我有以下XML文件(为了说明起见,我在这里减少了XML和XSLT;在真正的XML文档中,有更多我关心的数据,也有更多我不关心的数据,通常有十几个标记,而不仅仅是这两个): 以下是我的尝试: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="t
标记,而不仅仅是这两个):
以下是我的尝试:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:variable name='NL'><xsl:text> </xsl:text></xsl:variable><!-- NL = newline character X'0A' -->
<xsl:template match="Document">
BeginRepeatedField,"Document"<xsl:text/>
ApplicationNumber,"<xsl:value-of select="normalize-space(SerialNumber)"/>"<xsl:text/>
MailRoomDate,"<xsl:value-of select="normalize-space(MailRoomDate)"/>"<xsl:text/>
DocumentTypeCode,"<xsl:value-of select="normalize-space(DocumentTypeCode)"/>"<xsl:text/>
EndRepeatedField,"Document"<xsl:text/>
</xsl:template>
</xsl:stylesheet>
我可以通过从模板末尾的最后一行删除
来解决这个问题:
EndRepeatedField,"Document"
或者通过显式添加换行符:
EndRepeatedField,"Document"<xsl:text/><xsl:value-of select='$NL' />
EndRepeatedField,“文档”
和,在这两种情况下,我在文件的顶部没有得到空行,而且我没有得到不必要的连接;但是现在我在文件的末尾有一个空行
我尝试过的每件事要么留下一个不需要的空行(在顶部或底部),要么有不需要的连接。有解决办法吗?例如,除了第一个
?
之外,任何有条件地在所有行中添加新行的方法都是一个空的、自动关闭的元素,不起任何作用
要输出文本,请将其放入xsl:text
元素中,使用打开
和关闭
标记-例如:
<xsl:template match="Document">
<xsl:text>BeginRepeatedField,"Document"</xsl:text>
...
BeginRepeatedField,“文档”
...
现在输出的是
和
之间的整个文本节点,包括换行符。
是一个空的、自动关闭的元素,它不做任何事情
要输出文本,请将其放入xsl:text
元素中,使用打开
和关闭
标记-例如:
<xsl:template match="Document">
<xsl:text>BeginRepeatedField,"Document"</xsl:text>
...
BeginRepeatedField,“文档”
...
现在输出的是
和
之间的整个文本节点,包括换行符。我可能有它。我不确定这是不是最好的方法,但它似乎有效
我发现了如何有条件地添加换行符。因此,我设置了最后一个模板行以抑制换行:
EndRepeatedField,"Document"<xsl:text/>
EndRepeatedField,“文档”
然后添加换行符,除非它是最后一个
:
这似乎奏效了;有待进一步测试。我可能有。我不确定这是不是最好的方法,但它似乎有效 我发现了如何有条件地添加换行符。因此,我设置了最后一个模板行以抑制换行:
EndRepeatedField,"Document"<xsl:text/>
EndRepeatedField,“文档”
然后添加换行符,除非它是最后一个
:
这似乎奏效了;有待进一步测试。不幸的是,这仍然会产生连接错误。@codingatty您需要在文档末尾换行。如果不希望在最后一行之后有一个尾随的换行符,请有条件地执行此操作-例如,请参阅:很遗憾,这仍然会产生连接错误。@codingatty您需要在文档末尾放置一个换行符。如果您不希望在最后一行之后有一个尾随的换行符,请有条件地执行此操作-例如,请参阅:按您所做的那样有条件地添加换行符是正确的。使用空的
xsl:text
元素是错误的。谢谢;但是如果没有空的xsl:text元素,则在输出中的每个分隔符行之间插入一个额外的空行。这在美学上可能是错误的,但它确实使它起作用。你提出了一个很好的观点,提出了一些意见。我发现其他CSV制作程序在最后一行中确实包含了换行符,因此我可能会重新思考这一点,以与之保持一致;然后改变这个程序来接受它。感谢您的帮助。“如果没有空的xsl:text元素,则在输出中的每个分隔符行之间插入一个额外的空行。”不,如果您按照我在回答中所说的进行操作,则不会。你所做的是一个恰巧可以工作的黑客(顺便说一句,它可以处理任何其他空元素,而不仅仅是xsl:text
)。像你所做的那样有条件地添加换行符是正确的。使用空的xsl:text
元素是错误的。谢谢;但是如果没有空的xsl:text元素,则在输出中的每个分隔符行之间插入一个额外的空行。这在美学上可能是错误的,但它确实使它起作用。你提出了一个很好的观点,提出了一些意见。我发现其他CSV制作程序在最后一行中确实包含了换行符,因此我可能会重新思考这一点,以与之保持一致;然后改变这个程序来接受它。感谢您的帮助。“如果没有空的xsl:text元素,则在输出中的每个分隔符行之间插入一个额外的空行。”不,如果您按照我在回答中所说的进行操作,则不会。您所做的是一个恰巧可以工作的黑客(顺便说一句,它可以处理任何其他空元素,而不仅仅是xsl:text
)。
<xsl:template match="Document">
<xsl:text>BeginRepeatedField,"Document"</xsl:text>
...
EndRepeatedField,"Document"<xsl:text/>
<xsl:if test="position () != last()">
<xsl:value-of select='$NL' />
</xsl:if>