Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [XSLT] jak usunac puste znaczniki xmlns
Forum PHP.pl > Forum > XML, AJAX
a79rtur
witam
jak z wyjsciowego kodu xhtml usunac puste znaczniki xmlns="" ?
devnul
ob_start();

echo preg_replace('/<.*?(xmlns="[[:space:]]?").*?>/si',"",ob_get_clean());
tak mniej więcej
a79rtur
a cos mniej ze tak powiem topornego ? moze cos trzeba ustawic w szablonie ? nie rozumiem dlaczego validator w3c sie rzuca o te xmlns bo mi to nie przeszkadza, tylko chce zeby strona byla zwalidowana poprawnie
mariuszn3
Atrybut xmlns określa przestrzeń nazw. Jesli przykładowo DOMDocument::saveXML() w kodzie XHTML wyrzuca Ci elementy z takimi atrybutami to znaczy, że dodałeś jakieś elementy z pustą przestrzenią nazw a nie przestrzenią nazw XHTML.. tu pewnie tkwi problem..
Kiedy korzystasz z jakichkolwiek przestrzeni nazw zawsze do tworzenia nowych elementów używaj createElementNS() a nie createElement()
a79rtur
jakies nowe rady w tym temacie ?
erix
To znaczy? Jakiś konkretny kod?
a79rtur
ok, przykladowo w htmlu po przetworzeniu ponizszego kodu pojawiaja sie znaczniki xmlns="", zalozmy ze apply-templates root powoduje wywolanie szablonu gdzie sa rozne divy, img i takie tam, wklejam tylko definicje glownego szablonu

  1. <xsl:stylesheet
  2.      version="1.0"
  3.      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.      
  5.      <xsl:output
  6.            method="xml"
  7.            encoding="UTF-8"
  8.            omit-xml-declaration="no"
  9.            doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
  10.            doctype-system="http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"
  11.            cdata-section-elements="script"
  12.            media-type="application/xhtml+xml"
  13.            />
  14.  
  15.       <xsl:include href="html_head.xsl" />
  16.      <xsl:include href="menu.xsl" />
  17.      <xsl:include href="header.xsl" />
  18.      <xsl:include href="footer.xsl" />
  19.  
  20.      <xsl:template match="/">
  21.      
  22.      <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">            
  23.            <head>
  24.                  <xsl:call-template name="html_head" />
  25.            </head>
  26.            <body>
  27.                  <xsl:apply-templates select="root" />
  28.            </body>
  29.      </html>
  30.      </xsl:template>
  31.      
  32. </xsl:stylesheet>
erix
A wynikowy? I zostają puste xmlns?
a79rtur
Niestety tak, wiekszosc elementów je ma jak link, div itp. Chce to poprawic poniewaz po pierewsze, w tym momencie dowolny validator wywala mi kupe ostrzezen. Po drugie jesli przed wyslaniem do przekladarki wynikowego xhtml wysle naglowek z content-type application/xhtml+xml to strona nie wyswietla sie poprawnie np na FF, po usunieciu recznie z kodu tych smieci jest ok.
erix
A co masz w arkuszach XSL?
a79rtur
wyzej wkleilem glowny szablon, tutaj np strona glowna

  1.  
  2. <xsl:stylesheet version="1.0"
  3.      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  4.  
  5.    <xsl:import href="content/page_RP0.xsl" />
  6.  
  7.    <xsl:template match="root">
  8.            
  9.            <xsl:call-template name="header" />
  10.  
  11.            <div id="main">
  12.                  <xsl:apply-templates select="contents/content_page[@type = 'RP0']" />
  13.            </div>
  14.            
  15.            <xsl:call-template name="footer" />
  16.            
  17.   </xsl:template>
  18.  
  19.  
  20. </xsl:stylesheet>
erix
Ech...

  1. <xsl:call-template name="header" />

i uważasz, że będziemy mieli szklaną kulę, żeby zobaczyć, co zawiera ten szablon...?
a79rtur
nic istotnego, tak jak i footer

  1.  
  2. <xsl:stylesheet
  3.      version="1.0"
  4.      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  5.  
  6.      <xsl:template name="header">
  7.            <div id="header">
  8.                 <img src="i/logo.gif" alt="logo" class="mobileLogo" width="218" height="36"/>
  9.            </div>
  10.      </xsl:template>      
  11.  
  12. </xsl:stylesheet>


w kodzie wynikowym ten div za to wyglada tak

  1. <div id="header" xmlns="">.....
erix
  1. <xsl:stylesheet
  2. version="1.0">

Albo wywal namespace, albo dopisz je tu:
  1. <xsl:template name="header">
a79rtur
jesli wywalam namespace to mam blad

Cytat
file:///xxxxxxxxxxxx namespace error : Namespace prefix xsl on stylesheet is not defined in xxxxxxxxxx


jak dopisac? do kazdego elementu tam ?
erix
Podałem gałąź. ;]
a79rtur
podaj kod smile.gif bo nie jarze
erix
Przecież podałem... :|
a79rtur
questionmark.gif
erix
  1. <xsl:template name="header" xmlns:xsl="...">

...
a79rtur
nic nie daje, poza tym w dokumentacji nie ma nic co by potwierdzalo uzycie tego znacznika dla elementu template
a79rtur
to jest dla Saxon'a (Java) i oni tam pokazuja jak dodawac przestrzenie nazw, a ja chce puste poprostu usunac albo dowiedziec sie co zrobic zeby nie byly dodawane
erix
No tak. Ale parser XSL podejrzewam, że jest ten sam (libxml/libxslt) w obu, tylko wywołanie inne.

Spakuj te pliki i wrzuć gdzieś; przyznam że męczy mnie ten temat.
a79rtur
uff, zajelo to pol dnia grzebania po necie i eksperymentowania ale znalazlem w koncu eleganckie rozwiazanie smile.gif
oto przykladowy glowny szablon, jest to dla stron pod komorki ale latwo mozna przerobic dla normalnej strony

  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
  2.      
  3.      <xsl:output
  4.            method="xml"
  5.            encoding="UTF-8"
  6.            omit-xml-declaration="no"
  7.            doctype-public="-//WAPFORUM//DTD XHTML Mobile 1.2//EN"
  8.            doctype-system="http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"
  9.            cdata-section-elements="script"
  10.            media-type="application/xhtml+xml"
  11.            />
  12.            
  13.       <xsl:include href="main_params.xsl" />
  14.       
  15.       <xsl:include href="html_head.xsl" />
  16.      <xsl:include href="menu.xsl" />
  17.      <xsl:include href="header.xsl" />
  18.      <xsl:include href="footer.xsl" />
  19.  
  20.      <xsl:template match="/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  21.      
  22.      <xsl:element name="html" namespace="http://www.w3.org/1999/xhtml">
  23.            <xsl:element name="head">
  24.                  <xsl:call-template name="html_head" />
  25.            </xsl:element>
  26.            <xsl:element name="body">
  27.                  <xsl:apply-templates select="root" />
  28.            </xsl:element>
  29.      </xsl:element>
  30.      </xsl:template>
  31.      
  32. </xsl:stylesheet>


Puste attrybuty xmlns="" przestaly sie pojawiac, gdy w tym glownym szablonie tworze elementy html, head i body za pomoca znacznika <xsl:element ...> a nie bezposrednio w kodzie <html ...> w innych szablonach ktore sa includowanie nie trzeba nic zmieniac

Przydatny link

PS: zeby bylo perfekcyjnie nalezalo by jeszcze wyslac odpowiedni mime type zalecany dla stron komórkowych np. tak

  1. <?php
  2. if(strstr($_SERVER["HTTP_ACCEPT"], 'application/xhtml+xml')) header('Content-type: application/xhtml+xml;');
  3. ?>


lub w .htaccess ustawic odpowiedni dla danego rozszerzenia, np.

Cytat
AddType application/xhtml+xml .xhtml
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.