2012-12-27 7 views
5

Questo è il file xml. Sono previsti gli spazi e il ritorno a capo nell'elemento "CategoryName".xsl: strip-space non rimuove il ritorno a capo

<?xml version="1.0" encoding="utf-8"?> 
<group> 
    <item> 
     <id>item 1</id> 
     <CategoryName> 


     </CategoryName> 
    </item> 
    <item> 
     <id>item 2</id> 
     <CategoryName></CategoryName> 
    </item> 
    <item> 
     <id>item 3</id> 
     <CategoryName>  </CategoryName> 
    </item> 

</group> 

Quanto segue è il file XSLT per il file XML sopra. Quello che si suppone di fare è che cancellerà tutti gli spazi vuoti nell'elemento "CategoryName". Quindi, verificherà se "CategoryName" è vuoto o meno.

<?xml version="1.0" encoding="utf-8"?> 
<!-- DWXMLSource="testempty.xml" --> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/> 

    <xsl:strip-space elements="*" /> <!--HERE IS STRIP SPACE--> 


    <xsl:template match="/"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title>Untitled Document</title> 
    </head> 

    <body> 
    <xsl:for-each select="/group/item"> 
     <xsl:if test="CategoryName = ''"> <!--HERE IS THE TEST--> 
     <p>Empty</p>   <!--IT WILL OUTPUT 'EMPTY' IF THE ELEMENT IS EMPTY--> 
     </xsl:if> 
    </xsl:for-each> 
    </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

Il problema è, xsl:strip-space non sta facendo il suo lavoro. Solo "CategoryName" dell'oggetto 2 passa il test "vuoto".

Cosa c'è che non va?

+0

Ho provato questo sul mio eclissi, ha funzionato come ti aspettavi. Stampa 3 "Vuoto" – Weibo

+0

che ho usato Adobe Dreamweaver e mostra solo un vuoto. – user1535147

+0

Possibile duplicato: http://stackoverflow.com/questions/1134318/xslt-xslstrip-space-does-not-work – K3N

risposta

1

Chiaramente, il processore XSLT di DeamWeaver presenta un bug.

Ecco un altro modo per ottenere il risultato voluto:

Sostituire:

<xsl:if test="CategoryName = ''"> 

con:

<xsl:if test="not(normalize-space(CategoryName))"> 
+0

Dopo 2 estenuanti giorni di ricerca del web .... Grazie di cuore. – user1535147

+0

@ user1535147, prego. Raccomando di leggere un buon libro su XPath - vedi questa risposta per buone risorse: http://stackoverflow.com/a/341589/36305 –

2

Non so quale motore XSLT venga utilizzato da Dreamweaver, ma sembra sbagliato.

Penso che ci possano essere alcuni processori XSLT che applicano solo xsl: strip-space se li si presenta con un input non ordinato (XML lessicale), e non se li si presenta con un DOM. Non c'è nulla nelle specifiche per giustificare un simile comportamento, ma rende la vita dell'implementatore molto più semplice.

Vale la pena sottolineare che questo NON è il modo in cui xsl: lo spazio dello strip è destinato a essere utilizzato. È inteso per essere utilizzato per eliminare spazi bianchi "ignorabili", ovvero gli spazi bianchi utilizzati per il rientro nel contenuto solo per elementi. Se si utilizza una trasformazione sensibile allo schema XSLT 2.0, questa viene formalizzata come una regola: xsl: strip-space non influirà sul contenuto di elementi con contenuto semplice. Questo perché spogliare gli spazi per un tale elemento potrebbe rendere l'elemento invalido rispetto allo schema.

+0

concordato! Lo spazio o il ritorno a capo non è nullo dopotutto! –

+0

Quindi cosa devo fare per testare gli elementi vuoti? – user1535147

+0

Usa il test 'normalize-space (XX)! = ''' –