如何将XSLT中的空行删除为CSV输出

时间:2011-03-15 17:13:38

标签: xslt

我有XML数据,我已使用XSLT转换为输出csv格式的文本。我的XSLT包含一个<xsl:if test>子句,用于过滤输入XML的较大数据集的结果。这样可以工作,但是从输入中过滤掉的每一行都在输出中显示为空行。 我尝试了<xsl:strip-space elements="*" /><xsl:template match="text()" />,但都没有删除空行。

我的XML示例:

<?xml version="1.0" encoding="UTF-8"?>
<session_list xmlns="http://www.networkstreaming.com/namespaces/API" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <session lsid="fef672741e025ffda1acb3041f09252d">
   <session_type>support</session_type>
   <lseq>2899</lseq>
   <start_time timestamp="1290027608">2010-11-17T16:00:08-05:00</start_time>
   <end_time timestamp="1290027616">2010-11-17T16:00:16-05:00</end_time>
   <duration>00:00:08</duration>

   <public_site id="1">Default</public_site>
   <external_key></external_key>
   <session_chat_view_url>https://mysite.com/session_download.ns?lsid=l%3Dfef672741e025ffda1acb3041f09252d%3Bh%3D9bd6081f0b7fee08dcc32a58ef4cb54c7a0e233d%3Bt%3Dsd%3Bm%3Dchat&amp;dl_action=chat&amp;view=1&amp;sessionType=sd</session_chat_view_url>
   <session_chat_download_url>https://mysite.com/session_download.ns?lsid=l%3Dfef672741e025ffda1acb3041f09252d%3Bh%3D9bd6081f0b7fee08dcc32a58ef4cb54c7a0e233d%3Bt%3Dsd%3Bm%3Dchat&amp;dl_action=chat&amp;sessionType=sd</session_chat_download_url>
   <file_transfer_count>0</file_transfer_count>

   <primary_customer gsnumber="3">Smith, John</primary_customer>
   <customer_list>
     <customer gsnumber="3">
     <username>Smith, John</username>
     <public_ip>xxx.xxx.xxx.xxx</public_ip>
     <private_ip>xxx.xxx.xxx.xxx</private_ip>
     <hostname>DESKTOP</hostname>

     <os>Windows 7 Enterprise x64 Edition (Build 7600)</os>
     <primary_cust>1</primary_cust>
      <info>
       <name></name>
       <company></company>
       <company_code></company_code>
       <issue></issue>
       <details></details>
      </info>
     </customer>
   </customer_list>
  ...etc...
 </session>
</session_list>

我的XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:bg="http://www.networkstreaming.com/namespaces/API" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:text>Session ID,</xsl:text>
<xsl:text>Start Time,</xsl:text>
<xsl:text>Duration,</xsl:text>
<xsl:text>Public Site,</xsl:text>
<xsl:text>Remedy Ticket Number,</xsl:text>
<xsl:text>Customer's Name,</xsl:text>
<xsl:text>Customer's Operating System,</xsl:text>
<xsl:text>Representative's Name</xsl:text>
<xsl:text>&#xD;</xsl:text>
<xsl:apply-templates/>
</xsl:template> 

<xsl:template match="bg:session_list">
<xsl:apply-templates select="bg:session"/>
</xsl:template>

<xsl:template match="bg:session">
<xsl:if test="contains(bg:customer_list/bg:customer/bg:os,'Click-To-Chat')">
<xsl:value-of select="bg:lseq"/>,<xsl:text/>
<xsl:value-of select="bg:start_time"/>,<xsl:text/>
<xsl:value-of select="bg:duration"/>,<xsl:text/>
<xsl:value-of select="bg:public_site"/>,<xsl:text/>
<xsl:value-of select="bg:external_key"/>,<xsl:text/>
<xsl:value-of select="bg:primary_customer"/>,<xsl:text/>
<xsl:value-of select="bg:customer_list/bg:customer/bg:os"/>,<xsl:text/>
<xsl:value-of select="bg:primary_rep"/>
</xsl:if>
<xsl:text>&#xD;</xsl:text>
</xsl:template>
</xsl:stylesheet>

输出样本:

Session ID,Start Time,Duration,Public Site,Remedy Ticket Number,Customer's Name,Customer's Operating System,Representative's Name

6488,2011-03-14T09:17:13-04:00,00:00:06,Default,,User One,Windows® (x86) Click-To-Chat,Rep1
6489,2011-03-14T09:44:50-04:00,00:39:58,Default,,Nate,Windows® (x86) Click-To-Chat,Rep1




6494,2011-03-14T10:25:23-04:00,00:03:29,Default,,User TEST,Windows® (x86) Click-To-Chat,Rep1



6498,2011-03-14T11:01:36-04:00,,Default,,User Two,Windows® (x86) Click-To-Chat,Diane

打印行之间的每一行都是过滤掉的数据,因为它没有通过<xsl:if test="contains(bg:customer_list/bg:customer/bg:os,'Click-To-Chat')">,但仍然打印出空行。在excel中打开时,此输出看起来不太好。

有没有人有任何想法如何删除它们?

谢谢!

1 个答案:

答案 0 :(得分:2)

您是否尝试将<xsl:text>&#xD;</xsl:text>行放入xsl:if?这是放置换行符的位,所以即使你不写行也要写一个换行符。