2016-07-20 9 views
0

У меня есть XSLT, который выглядит следующим образом:XSL - обрезать пустые строки и начальные пробелы

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="no" encoding="utf-8" media-type="text/plain" /> 
    <xsl:template match="/SOME/NODE"> 
     <xsl:if test="./BLAH[foo]"> 
<xsl:value-of select="concat(@id, ',' , ./BLAH/bar/@id, ',' , ./blorb/text())"/> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

Результат выглядит примерно так (это будет файл CSV):

 


    1,2,3 
    4,456,22 

    90,5,some text 


    365,16,soasdkjasdjkasdf 
    9,43,more text 

что мне нужно для того, чтобы быть преобразованы в:

 
1,2,3 
4,456,22 
90,5,some text 
365,16,soasdkjasdjkasdf 
9,43,more text 

Основными проблемами являются пустые строки (из узлов, которые не соответствуют I F) и отступом. Есть ли способ удалить пустые строки и обрезать отступы, сохраняя разрывы строк после строк, которые не являются пустыми?

Я попытался с помощью <xsl:strip-space elements="*"/>, но тогда результат выглядит следующим образом:

 
1,2,3,4,456,22,90,5,some text,365,16,soasdkjasdjkasdf,9,43,more text 

Который не работает, так как мне нужно иметь 3 значения в каждой строке.

В соответствии с просьбой, а (сильно упрощенный) образец ввода:

<SOME> 
    <NODE> 
     <BLAH id="1"> 
      <foo>The Foo</foo> 
      <bar id="2" /> 
      <blorb> some text </blorb> 
     </BLAH> 
    </NODE> 
    <NODE> 
     <BLAH id="3"> 
      <bar id="4" /> 
      <blorb>some text that shouldn't be in output because there's no foo here</blorb> 
     </BLAH> 
    </NODE> 
    <NODE> 
     <BLAH id="5"> 
      <foo>another Foo</foo> 
      <bar id="6" /> 
      <blorb>some other text</blorb> 
     </BLAH> 
    </NODE> 
</SOME> 
+0

Пожалуйста, покажите нам вход. Я предполагаю, что вы хотите использовать '', но нам действительно нужно воспроизвести проблему, прежде чем предлагать решения. –

+0

@ michael.hor257k: Я пробовал использовать 'strip-space'. Я обновил вопрос, чтобы отразить это. – FrustratedWithFormsDesigner

+0

Почему бы вам не показать нам пример ввода в соответствии с запросом? - P.S. Если вы хотите вернуться, вам нужно вывести его явно - как и любой другой символ. –

ответ

1

Я хотел бы предложить вам подойти к нему так:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="utf-8" /> 

<xsl:template match="/SOME"> 
    <xsl:for-each select="NODE/BLAH[foo]"> 
     <xsl:value-of select="@id"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="bar/@id"/> 
     <xsl:text>,</xsl:text> 
     <xsl:value-of select="blorb"/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 
+0

С 'strip-space', это отлично работает! Спасибо за помощь! :) – FrustratedWithFormsDesigner

+0

@FrustratedWithFormsDesigner Нет причин, по которым это не должно работать отлично даже без 'xsl: strip-space'. –

+0

@ michael.hor275k: Вы, вероятно, правы, но ... это не так! Для чего это стоит, я использую XSLT-процессор, встроенный в Eclipse, «JRE Instance Default», хотя, когда я пытался переключиться на процессор Xalan, он дал те же результаты (пустые строки и отступы), если 'strip-space 'не было. – FrustratedWithFormsDesigner

Смежные вопросы