|
Podwójne kodowanie znaków specjalnych w XSLTOstatnio musiałem wyciągnąć pewne dane z pliku XML i zastosować je następnie w PHP. Ponieważ potrzebowałem zrobić to tylko raz, pomyślałem sobie że stworzę arkusz XSLT który dołączę do pliku XML. Potem otworzę plik XML w przeglądarce i skopiuję sobie wygenerowany przez arkusz XSLT kod PHP do pliku. Wydawało się to proste, więc zabrałem się do pracy i po jakimś czasie już miałem w oknie przeglądarki gotowy kod PHP. Niestety nie przewidziałem jednej rzeczy: część stringów które potrzebowałem przenieść do PHP zawierała w sobie cudzysłowy, przez co PHP zaczął się burzyć o składnię skryptu. Zatem musiałem coś z tym zrobić. Rozwiązanie które zastosowałem opiera się na wykorzystaniu znacznika Moje rozwiązanie wykorzystuje też możliwość przekazania do takiego szablonu parametru z zewnątrz, oraz fakt że arkusz może wywołać siebie rekurencyjnie. Sam algorytm przetwarzania jest natomiast prosty:
Gotowe rozwiązanie wygląda zatem następująco: <xsl:template name="escaper"> <xsl:param name="str" /> <xsl:choose> <xsl:when test="contains($str, '"')"> <xsl:value-of select="substring-before($str, '"')" /> <xsl:text>&quot;</xsl:text> <xsl:call-template name="escaper"> <xsl:with-param name="str" select="substring-after($str, '"')" /> </xsl:call-template> <xsl:text></xsl:text> </xsl:when> <xsl:otherwise> <xsl:value-of select="$str" /> </xsl:otherwise> </xsl:choose> </xsl:template> Samo zastosowanie powyższego kawałka kodu we własnym arkuszu XSLT jest też proste: <xsl:template match="nazwa"> <xsl:text>nazwy[] = "</xsl:text> <xsl:call-template name="escaper"> <xsl:with-param name="str" select="." /> </xsl:call-template> <xsl:text>";</xsl:text> </xsl:template> Dodaj linka na swojej stronie! Po prostu skopiuj poniższy kod i wklej go na swojej stronie WWW. Gotowy link będzie wyglądał w taki sposób: |
| ||||||||||||||||||||||||||||||