Как удалить пустые строки в XSLT для вывода CSV - PullRequest
1 голос
/ 15 марта 2011

У меня есть данные 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 Ответ

2 голосов
/ 15 марта 2011

Вы пытались поместить строку <xsl:text>&#xD;</xsl:text> в xsl: if?Это бит, который ставит новую строку, поэтому в данный момент вы пишете ее, даже если вы не пишете строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...