2016-07-20 9 views
0

Ich habe eine XSLT, die wie folgt aussieht:XSL Textausgabe - trimmen Leerzeilen und führende Leerzeichen

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

Die Ausgabe sieht ungefähr so ​​aus (es wird eine CSV-Datei sein):

 


    1,2,3 
    4,456,22 

    90,5,some text 


    365,16,soasdkjasdjkasdf 
    9,43,more text 

Was ich brauche, ist es in umgewandelt werden:

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

die Hauptprobleme sind die Leerzeilen (von Knoten, die nicht den ich passen F Zustand) und die Einrückung. Gibt es eine Möglichkeit, die Leerzeilen zu entfernen und den Einzug zu trimmen, während die Zeilenumbrüche nach nicht leeren Zeilen beibehalten werden?

Ich habe versucht, <xsl:strip-space elements="*"/> verwenden, aber dann sieht die Ausgabe wie folgt aus:

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

Was nicht da ich auf jeder Zeile 3 Werte haben müssen, nicht funktioniert.

Wie gewünscht, eine (stark vereinfacht) Probe des Eingangs:

<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

Bitte zeigen Sie uns die Eingabe. Ich vermute, Sie wollen '' verwenden, aber wir müssen das Problem wirklich reproduzieren, bevor wir Lösungen vorschlagen. –

+0

@ michael.hor257k: Ich habe 'Strip-Space' versucht. Ich habe die Frage aktualisiert, um dies zu berücksichtigen. – FrustratedWithFormsDesigner

+0

Warum zeigen Sie uns nicht ein Beispiel für die Eingabe wie gewünscht? - PS Wenn Sie eine Rückgabe wünschen, müssen Sie sie explizit ausgeben - genau wie jedes andere Zeichen. –

Antwort

1

Ich würde vorschlagen, dass Sie es auf diese Weise nähern:

<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

Mit 'Strip-Space' funktioniert das perfekt! Danke für die Hilfe! :) – FrustratedWithFormsDesigner

+0

@FRustratedWithFormsDesigner Es gibt keinen Grund, warum dies auch ohne 'xsl: strip-space' nicht perfekt funktionieren sollte. –

+0

@ michael.hor275k: Du hast wahrscheinlich Recht, aber ... es ist nicht! Für das, was es wert ist, benutze ich den XSLT-Prozessor, der in Eclipse eingebaut ist, "JRE Instance Default", aber wenn ich versuchte, zum Xalan-Prozessor zu wechseln, gab es die gleichen Ergebnisse (leere Zeilen und Einrückung) wenn 'strip-space 'war nicht da. – FrustratedWithFormsDesigner