2012-05-22 9 views
17

Używam XSLT do bardzo prostej transformacji w dokumencie XML. Chcę tylko usunąć wszystkie węzły elementów o określonej nazwie. Zdarza się, że w moim dokumencie źródłowym wszystkie te węzły znajdują się na końcu dokumentu, ale po transformacji, chociaż węzły zniknęły tak, jak zamierzałem, w ich miejscu jest dużo pustych linii.uzyskiwanie jazdy po pustych liniach po usunięciu węzłów za pomocą XSLT

Jest to kwestia czysto kosmetyczna, ponieważ osiągnąłem to, co chciałem z transformacją, ale z ciekawości: jak mogę pozbyć się tych pustych linii? Jest to plik XSL użyłem do transformacji (element chciałem usunąć nazwie „relacje”):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 

    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="relation"/> 

</xsl:stylesheet> 

Odpowiedz

21

Powodem jest w węzłach tekstowych white-space-tylko, że są natychmiastowe rodzeństwo usunięte elementy.

Rozwiązanie: Wystarczy dodać tej instrukcji XSLT, aby usunąć wszelkie white-space-tylko węzły tekstowe - nawet przed transformacja jest uruchomiona:

<xsl:strip-space elements="*"/> 

Wynik może stracić wcięcia - jeśli tak, dodać to:

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

kompletny transformacja staje:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="*"> 
     <xsl:copy> 
      <xsl:copy-of select="@*" /> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="relation"/> 
</xsl:stylesheet> 

po nałożeniu na tego dokumentu XML (brak przewidzianego!):

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 

    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
</nums> 

Pożądane, poprawny wynik (bez spływu white-space) jest produkowany:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 
+2

Jedynym uwaga, którą chciałbym dodać to: przed dodaniem xsl: strip-space do twojego arkusza stylów, sprawdź, czy dokument źródłowy nie zawiera znaczących białych znaków, czyli białych znaków w mieszanych treściach. –

+1

Czy istnieje sposób, aby powiedzieć, że chcę usunąć białą przestrzeń tylko do rodzeństwa węzłów "relacji"? – Sergio

+1

@Sergio: Tak: użyj: '' –

Powiązane problemy