2013-08-08 16 views
5

Z tego wejściaJak prostu zwykły tekst i podziały wierszy przy użyciu XSL

<?xml version="1.0" encoding="UTF-8"?> <data> 
This is a senstence 
this is another sentence 

<section> 
     <!--comment --><h2>my H2</h2>  <p>some paragraph</p>    <p>another paragraph</p>     
    </section> </data> 

muszę zastosować arkusz stylów XSL, aby uzyskać tylko zwykły tekst, cześć podziały wiersza i usunąć poprzedzająca białą przestrzeń. Po wyszukiwaniu w Internecie dla kilku próbek próbowałem tego, ale to nie działa dla mnie. Przepraszam, nie jestem zaznajomiony z XSL i myślałem, że zapytam.

Próba XSL, ale nie działa. Jakieś pomysły?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:strip-space elements="*" /> 

     <xsl:template match ="@* | node()"> 
      <xsl:copy> 
       <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy>  
     </xsl:template> 

     <xsl:template match="h1|h2"> 
      <xsl:text> 
      </xsl:text> 
      <xsl:copy> 
       <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy> 
     </xsl:template> 
</xsl:stylesheet> 

Jest to wynik po zastosowaniu XSL. Jak widać, jego cała linia, a nie karetka powraca.

This is a sentence this is another sentence m H2some paragraphTanother paragraph 

To jest wynik, który chciałbym uzyskać. Tekst w H1 | H2 | H3 powinien mieć podział wiersza przed i po.

This is a sentence 
this is another sentence 

my H2 

some paragraph 
another paragraph 
+0

Co oznacza "nie działa"? Czy wyświetla komunikat o błędzie? Czy robi coś, czego nie chcesz robić? Czy wypluwa karła? – ApplePie

+0

Rozważ opublikowanie wyjściowego tekstu w formacie tekstowym, który chcesz opublikować. –

+0

Dzięki! Chciałem także je włączyć. –

Odpowiedz

4

Trzeba atrybut xml:space="preserve" utrzymać powrotu karetki w xml:text i trzeba powrotu karetki przed i po zawartości h1 i h2 tagi:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" encoding="UTF-8"/> 
    <xsl:strip-space elements="*" /> 

    <xsl:template match ="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="h1|h2"> 
    <xsl:text xml:space="preserve"> 
</xsl:text> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    <xsl:text xml:space="preserve"> 
</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

pierwotnego tekstu (This is a senstence, this is another sentence) jest wyprowadzany poprawnie w oddzielnych wierszach w moim przypadku (przy użyciu Visual Studio 2012 do wykonania XSLT).

Piszesz, że tylko h tagi powinny mieć znak powrotu karetki dodanej - w próbce some paragraph i another paragraph są w p znaczniki, więc nie ma powrotu karetki są dodawane i są wyprowadzane na tej samej linii.

+1

'' automatycznie zachowuje spacje, nie potrzebujesz 'xml: space' na tym. Ale generalnie wolę używać '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', aby wstawić znak nowej linii", ponieważ oznacza to, że mogę bezpiecznie ponownie zindentować plik XSLT bez zmiany semantyki. –

+0

@IanRoberts: zależy od tego, jak załadujesz/wykonasz XSLT - jest to nieistotna biała przestrzeń i tak (można) zostać usuniętą, jeśli 'xml: space =" zachowaj "' nie istnieje – MiMo

+0

[Spec] (http: //www.w3.org/TR/xslt#strip) mówi, że '' powinno zawsze zachować przestrzeń. Jeśli nie, to jest to błąd w procesorze. Masz jednak rade, że mogą wystąpić problemy, jeśli procesor nie ma kontroli nad procesem parsowania XSLT (np. Jeśli inny komponent analizuje plik .xsl w drzewie DOM z pustą przestrzenią, następnie przekazuje DOM do procesora XSLT). –

Powiązane problemy