我有以下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> </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>
似乎正在工作;进行进一步的测试。