2008-10-08 17 views
12

Ich habe ein XSL-Stylesheet mit Inhalt in einem xsl:text Knoten wie folgt aus:Interpretieren von Zeilenumbrüchen mit xsl: text?

<xsl:text> 
foo 
bar 
baz 
</xsl:text> 

Das Stylesheet selbst ist eine Textdatei mit „Unix-Stil“ Newline Linie Terminatoren. Ich verwende dieses Stylesheet sowohl auf Windows als auch auf Unix-ähnlichen Plattformen. Es wäre schön, wenn die Ausgabe den Konventionen der Plattform entspricht, auf der sie aufgerufen wird.

Wenn ich dieses Stylesheet unter Windows ausführen, hat die Ausgabe Carriage Return/Newline-Paare für alles außer den Inhalt des xsl:text-Knoten.

Kann ich den XSLT-Prozessor anweisen, die Newline-Zeichen im Inhalt des xsl:text-Knotens in plattformspezifische Zeilenende zu übersetzen?

Weitere Kontext: Ich Aufruf des Sheet vom Apache Ant 1.7.1 XSLT task wie folgt aus:

<xslt in="in.xml" out="out.xml" style="stylesheet.xsl"/> 

Das Stylesheet-Header wie folgt aussieht derzeit: sure

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xslt" 
    exclude-result-prefixes="xalan"> 
    <!-- contents elided --> 
</xsl:stylesheet> 

Antwort

1

Im nicht, wie man die richtige tun Newlines automatisch (dies kann vom verwendeten XSLT-Prozessor abhängen), aber Sie können möglicherweise die Zeilenumbrüche im Inhalt Ihres Textknotens erzwingen. ist &#xD; &#xA;, ist &#xA;, z. Sie würden verwenden:

<xsl:text>foo&#xD;&#xa;bar&#xD;&#xa;</xsl:text>, um die Ausgabe zu erhalten, die Sie suchen.

+0

Danke für die Antwort! Ja, ich denke ich könnte das machen, aber dann wäre die Ausgabe in Unix-ähnlichen Umgebungen falsch! Anstatt es auf die eine oder andere Weise zu kodieren, möchte ich, dass es "das Richtige tut", unabhängig davon, wo es aufgerufen wird. Vielleicht sollte ich das in der Frage klären. Danke noch einmal. –

5

Sie können einen Parameter für das Stylesheet definieren wie folgt:

<xsl:param name="br"> 
    <xsl:text>&#10;</xsl:text> 
</xsl:param> 

und in der entsprechenden Zeilenende-Zeichen (n) vorbei ein verschachteltes param-Element in Ihrem Ant-Skript. Der Standardwert in diesem Beispiel wäre natürlich ein Zeilenumbruch im Unix-Stil. Ich denke, um den Wert auszugeben, müssten Sie verwenden:

<xsl:copy-of select="$br"/> 

Es ist ausführlich, aber es funktioniert.

+0

Danke für die Antwort! Das ist eine gute Idee, aber ich glaube nicht, dass xsl: copy-of im Textkörper von xsl: text eingebettet sein kann. Kann eine Entität stattdessen mit dem Parameter definiert werden? Ich kann Dinge wie <, was ist mit &myeol;? Wie ist das gemacht? Im Idealfall möchte ich einen Weg, dies zu tun, ohne EOL über einen Parameter zu übergeben. –

+0

Warum muss es innerhalb von xsl: text sein? Warum nicht ein paar jsight

4

Wenn Sie anrufen, die von Ant verwandeln, dann you can test for the OS using a conditional task with a test for the OS family:

<condition property="linebreak" value="&#xD;&#xa;"> 
     <os family="windows"/> 
    </condition> 
    <condition property="linebreak" value="&#xa;"> 
     <os family="unix"/> 
    </condition> 

dann diesen Parameter auf den XSLT passieren die Newline-Zeichen (n) Sie verwenden möchten, um zu signalisieren.

<xslt in="data.xml" out="${out.dir}/out.xml"> 
    <param name="linebreak" expression="${linebreak}" /> 
</xslt> 
0

Nun, ich habe mich mit einer Kombination aus zwei Ideen oben (mit Saxon) zu arbeiten:

<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 

und dann Zeile (n) wie diese, wo nötig.

<xsl:value-of select="$br" /> 

Hier ist meine voll (aber Slimline) xsl

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!--<xsl:strip-space elements="*" />--> 
    <xsl:output method="text" /> 
    <!-- <xsl:preserve-space elements="*"/>--> 
<xsl:param name="br"> 
     <xsl:text>&#xD;&#xa;</xsl:text> 
</xsl:param> 


    <!-- --> 
    <xsl:template match="/"> 


    <xsl:for-each select="//root/Item"> 

     <xsl:value-of select="@Name" /> <!-- Your xpath will vary of course! --> 
     <xsl:value-of select="$br" /> 

    </xsl:for-each> 

</xsl:template> 

Noch einmal, ich bin mit Saxon % Programfiles% \ SaxonHE \ bin \ Transform.exe auf einem Windows 7 x64 Maschine.

Verwandte Themen