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

orcid.org/0000-0002-6838-2135
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