从XML转换为CSV W/ XSLT 1.0,获得空白



我有以下XML文件(我在此处删除XML和XSLT以进行插图目的;在Real XML文档中,还有更多我关心的数据,我不在乎的是,通常还有十几个<Document>标签的顺序,而不仅仅是这里的两个标签(:

<DocumentList>
  <Document>
    <SerialNumber>74631225</SerialNumber>
    <MailRoomDate>2011-12-27-05:00</MailRoomDate>
    <DocumentTypeCode>URC</DocumentTypeCode>
  </Document>
  <Document>
    <SerialNumber>74631225</SerialNumber>
    <MailRoomDate>2011-12-19-05:00</MailRoomDate>
    <DocumentTypeCode>IPC</DocumentTypeCode>
  </Document>
</DocumentList>

我想将其转换为逗号分隔的值,每个文档先于之前,然后使用定界线线(分别为repeatedfield和endrepeatedfield(,如下所示:

BeginRepeatedField,"Document"
ApplicationNumber,"74631225"
MailRoomDate,"2011-12-27-05:00"
DocumentTypeCode,"URC"
EndRepeatedField,"Document"
BeginRepeatedField,"Document"
ApplicationNumber,"74631225"
MailRoomDate,"2011-12-19-05:00"
DocumentTypeCode,"IPC"
EndRepeatedField,"Document"

这是我的尝试:

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

当我使用此功能时,我在文件开头会得到一条额外的空白行。现在,我回来时在类似上下文中问了一个类似的问题 - XSLT转换中的一个讨厌的空白行 - 并应用了我在那里学到的东西,我将模板中的第一行更改为 <xsl:text/>

<xsl:text/>BeginRepeatedField,"Document"<xsl:text/>

确实摆脱了空白线;但是,当我这样做时,第一个文档的关闭定界符线和第二个文档的开头定界符会被串联:

EndRepeatedField,"Document"BeginRepeatedField,"Document"

我可以通过从模板末尾的最后一行中删除<xsl:text/>来解决:

EndRepeatedField,"Document"

或通过显式添加新线:

EndRepeatedField,"Document"<xsl:text/><xsl:value-of select='$NL' />

,在这两种情况下,我都没有在文件的顶部得到空白,也没有得到那种不必要的串联。但是现在我在文件的 end 上得到了一条空白。

我尝试过的一切都使我拥有一条不必要的空白线(在顶部或底部(,或者具有不必要的串联。有解决方案吗?例如,除了第一个<Document>

<xsl:text/>是一个空的自闭元素,无助。

要输出文字文本,请将其内部使用xsl:text元素,使用打开<xsl:text>并关闭</xsl:text>标签 - 例如:

<xsl:template match="Document">
<xsl:text>BeginRepeatedField,"Document"</xsl:text>
...

您现在已经输出<xsl:template match="Document"><xsl:text/>之间的整个文本节点,包括Newline字符/s。

我可能拥有它。我不确定这是最好的方法,但似乎有效...

我发现了如何有条件地添加新线。因此,我设置了最后一个模板行以抑制新线:

EndRepeatedField,"Document"<xsl:text/>

,然后添加newline,除非是最后一个<Document>

<xsl:if test="position () != last()">
    <xsl:value-of select='$NL' />
</xsl:if>

似乎正在工作;进行进一步的测试。

相关内容

  • 没有找到相关文章

最新更新