Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT 1.0从XML转换为CSV,获得空行_Xml_Csv_Xslt 1.0 - Fatal编程技术网

使用XSLT 1.0从XML转换为CSV,获得空行

使用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文件(为了说明起见,我在这里减少了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="text" encoding="utf-8" />
<xsl:strip-space elements="*"/>
<xsl:variable name='NL'><xsl:text>&#10;</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>