Przy używaniu transformacji Xsl należy pamiętać o przestrzeniach nazw Xml. Załóżmy, że mamy dokument Xml i transformację Xsl do jej przetwarzania:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type='text/xsl' href='Transformation.xsl'?> <A> <B> bbb </B> <B> bbb </B> </A>Transformajca wygląda natomiast tak:
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" indent="yes" standalone="no" omit-xml-declaration="yes" encoding="windows-1250" /> <xsl:template match="B" > <LI> <xsl:value-of select="current()"/> </LI> </xsl:template> <xsl:template match="A" > <HTML> <HEAD> </HEAD> <BODY> <UL> <xsl:apply-templates select="B"/> </UL> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
Wynikiem działania przedstawionej transformacji na przykładowym dokumencie Xml powinna być lista:
- bbb
- bbb
Wynik będzie zupełnie inny jeśli zmodyfikujemy dokument Xml w następujący sposób:
... <A xmlns="a.b.c"> ...
Po tej zmianie otrzymamy taki, mało przyjazny rezultat transformacji:
bbb bbb
Aby rozwiązać problem należy zmodyfikować definicję transformacji poprzez jawne wskazanie przestrzeni nazw z jakiej pochodzą przetwarzane węzły dokumentu Xml. Po pierwsze należy podać definicję nowej przestrzeni nazw poprzez dodanie do węzla xsl:stylesheet atybutu xmlns:test="a.b.c". Oczywiście można podać inną skróconą nazwę przestrzeni nazw niż test. Następnie należy dodać przedrostek test: przed każdym odwołaniem do węzła z dokumentu np.:
... <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:test="a.b.c"> ...
... <xsl:template match="test:B" > <LI> <xsl:value-of select="current()"/> </LI> </xsl:template> ...
1 comments:
Najważniejszy moim zdaniem jest fakt, że w XSLT nie prefiks jest ważny, a przestrzeń, na którą on wskazuje. Wniosek: dwa prefiksy są tożsame, jeśli wskazują na tę samą przestrzeń.
Post a Comment