2012-12-27 19 views
5

To jest plik xml. Wymagane są spacje i powrót karetki w elemencie "CategoryName".xsl: strip-space nie usuwa powrót karetki

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

Poniżej znajduje się plik XSLT dla powyższego pliku XML. Chodzi o to, aby wyczyścić wszystkie puste przestrzenie w elemencie "CategoryName". Następnie sprawdzi, czy "NazwaKategorii" jest pusta, czy nie.

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

Problem polega na tym, że xsl:strip-space nie wykonuje swojej pracy. Tylko "Nazwa kategorii" przedmiotu 2 przekazuje "pusty" test.

Co jest nie tak?

+0

testowałem to na moim Eclipse, to działało zgodnie z oczekiwaniami. Drukuje 3 "Pusty" – Weibo

+0

Użyłem Adobe Dreamweaver i pokazuje tylko jeden pusty. – user1535147

+0

Możliwe duplikaty: http://stackoverflow.com/questions/1134318/xslt-xslstrip-space-does-notwork – K3N

Odpowiedz

1

Oczywiście, procesor XSLT DeamWeaver ma błąd.

Oto kolejny sposób, aby uzyskać żądaną wynik:

Wymień:

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

z:

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

Po 2 wyczerpujących dniach od znalezienia sieci .... Dziękuję z serca. – user1535147

+0

@ user1535147, Nie ma za co. Polecam lekturę dobrej książki o XPath - zobacz tę odpowiedź dla dobrych zasobów: http://stackoverflow.com/a/341589/36305 –

2

Nie wiem, jakiego silnika XSLT używa Dreamweaver, ale wygląda to nie tak.

Myślę, że mogą istnieć niektóre procesory XSLT, które stosują tylko xsl: strip-space, jeśli przedstawisz je z niezanalizowanym wejściem (leksykalny XML), a nie, jeśli przedstawisz je jako DOM. W specyfikacji nie ma nic, co usprawiedliwiałoby takie zachowanie, ale znacznie ułatwiło życie realizatorowi.

Warto jednak zauważyć, że nie jest to sposób w jaki xsl: strip-space ma być używany. Ma być używany do usuwania "białych" spacji, czyli białych znaków używanych do wcięcia w treści elementarnej. Jeśli używasz transformacji świadomej schematu XSLT 2.0, staje się ona z reguły sformalizowana: xsl: strip-space nie wpłynie na zawartość elementów mających prostą treść. Wynika to z faktu, że usunięcie przestrzeni dla takiego elementu może spowodować, że element będzie nieważny w stosunku do schematu.

+0

zgodził się! Zwrot przestrzeni lub karetki nie jest przecież zerowy! –

+0

Co mam zrobić, aby przetestować puste elementy? – user1535147

+0

Użyj testu 'normalize-space (XX)! = ''' –