Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Formatowanie tekstu XML/XSL i CDATA
Malinaa
post 29.02.2012, 19:37:28
Post #1





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


Witam,
mam prośbę, nie mogę znaleźć metody na wyświetlanie sformatowanego tekstu?

Używam biblioteki DOMDocument

w pliku xml mam taki kod:
  1. <code><![CDATA[
  2. <ul><li><b>lista 1</b></li>
  3. <li><b>lista 2</b></li>
  4. <li><b>lista 3</b></li>
  5. </ul>]]></code>


w pliku xsl kod jest taki:
  1. <ul><xsl:attribute name="class">code</xsl:attribute>
  2. <xsl:for-each select="code/ul/li">
  3. <li><xsl:apply-templates /></li>
  4. </xsl:for-each>
  5. </ul>


a problem nie wczytuje mi znaczników <b>pogrubienia</b>, jak odczytać pogrubienie?

I jeden problem więcej z CDATA, które muszę wyciąć aby wyświetlić kod, w przeciwnym razie nie czyta listy.
Co zrobić, aby wyświetlać całą zawartość z <code> pozostawiając oryginalną pełną zawartość pliku bez konieczności usuwania CDATA?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
Crozin
post 29.02.2012, 19:58:43
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie możesz użyć tutaj XSL-a, ponieważ to co masz w znaczniku <code> to zwykły tekst, który nie ma żadnego znaczenia (z punktu widzenia XML-a). Tam nie ma żadnego znacznika, możesz to traktować na równi z "Ala ma kota".
Musiałbyś najpierw pozbyć się otaczającego CDATA:
1. Wczytaj cały dokument.
2. Odczytaj zawartość z elementu <code>.
3. Na podstawie odczytanej treści utwórz nowy dokument (a dokładniej fragment).
4. W pierwotnym dokumencie usuń całą zawartość <code>, dodaj wygenerowany fragment dokumentu i całość zapisz.
5. Dopiero na takim dokumencie używaj XSL.

Od biedy - jeżeli to jakiś jednorazowy/niezbyt istotny skrypt - str_replace i na pałę wywal "<![CDATA[" oraz "]]>". Ale jeżeli to normalny skrypt, licz się z tym, że prędzej czy później takie coś spowoduje błędy.

Ten post edytował Crozin 29.02.2012, 20:00:08
Go to the top of the page
+Quote Post
Malinaa
post 29.02.2012, 20:23:43
Post #3





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


To normalny skrypt.

1. Wczytaj cały dokument.
- Ok
2. Odczytaj zawartość z elementu <code>.
- Tak, ale takich elementów jest w pliku dziesiątki
3. Na podstawie odczytanej treści utwórz nowy dokument (a dokładniej fragment).
- Nowe dokumenty dla każdego <code> to dziesiątki dokumentów (co masz dokładniej na myśli mówiąc dokument)
4. W pierwotnym dokumencie usuń całą zawartość <code>, dodaj wygenerowany fragment dokumentu i całość zapisz.
- Jak tutaj dodać na miejsce każdego <code> odpowiedni fragment
(z instrukcji brzmi to jak bym miał dodać na miejsce <code> to samo co wcześniej wyciąłem, o co chodzi?)
5. Dopiero na takim dokumencie używaj XSL.
- Te pliki xml i xsl miały ze sobą już działać.
Po co tyle plików, dokumentów, może jeszcze raz, please wink.gif



Ten post edytował Malinaa 29.02.2012, 20:28:21


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
Crozin
post 29.02.2012, 20:47:52
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Może i nie powinienem tego robić, ale bardziej mi się chciało przykład zrobić niż całość opisywać. wink.gif
  1. <?php
  2.  
  3. $doc = new DOMDocument('1.0', 'UTF-8');
  4. $doc->load('./my-code.xml');
  5.  
  6. $codeElements = $doc->getElementsByTagName('code');
  7. foreach ($codeElements as $codeElement) {
  8. $fragment = $doc->createDocumentFragment();
  9. $fragment->appendXML($codeElement->textContent);
  10.  
  11. foreach ($codeElement->childNodes as $child) {
  12. $codeElement->removeChild($child);
  13. }
  14.  
  15. $codeElement->appendChild($fragment);
  16. }
  17.  
  18. echo $doc->saveXML();
Taki dokument (o ile to poprawnie działa) dopiero poddajesz transformacjom.

EDIT: W sumie zamiast usuwania elementów i dodania jednego na końcu, można by po prostu skorzystać z DOMNode::replaceChild().

Ten post edytował Crozin 29.02.2012, 20:48:51
Go to the top of the page
+Quote Post
Malinaa
post 29.02.2012, 21:32:57
Post #5





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


Dziękuje Crozin,
ten kod jak widzę "usuwa" CDATA - super,
czyli zostało tylko pogrubienie?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post
Crozin
post 29.02.2012, 22:05:41
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ten kod zamienia tekst na konkretne elementy XML-a - zapisz/wyświetl sobie zmodyfikowany plik, to zobaczysz pełną różnicę.
Go to the top of the page
+Quote Post
Malinaa
post 1.03.2012, 00:22:20
Post #7





Grupa: Zarejestrowani
Postów: 518
Pomógł: 6
Dołączył: 21.07.2008

Ostrzeżenie: (0%)
-----


Patrzę na różnicę, kod jest ładnie poukładany, ale w kodzie widzę, że usunięto tylko CDATA inne bez zmian?

Do kodu, który przesłałeś dodałem taki kod:

  1. // Konwertowany tekst
  2. $xml = $doc->saveXML(); // z Twojego skryptu i dalej
  3.  
  4. // Zapis danych
  5. $file_xml_save = 'xml/save/'.$file_array[$id_main];
  6.  
  7. if (!file_exists($file_xml_save) || (filesize($file_xml_save) == 0)) {
  8. if ($fp = @fopen($file_xml_save, 'w')) {
  9. fwrite($fp, $xml);
  10. fclose($fp);
  11. }
  12. }
  13.  
  14. // Transformacja XML-a
  15. require_once("class/transform.class.php");
  16.  
  17. $transform = new transform("$file_xml_save");
  18. echo $transform->display("xml/fishing_time.xsl");


Czy muszę tutaj produkować taką liczbę plików i wszystkie zapisywać ?

Strona jest już cool. XML, HTML z CSS pięknie już wygląda, ale nadal i tylko brak na stronie <b>pogrubienia</b> w listach wyliczeniowych jak je uzyskać ?


--------------------
I welcome you on the Internet >>> Design by Malina
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.04.2024 - 10:37