Stworzenie XSLT na podstawie XML

0

Witam,

Mam taki plik XML:

<?xml version="1.0" encoding="utf-8"?>
<library xmlns="http://void.net/library/1.0">
    <catalog>
        <cd id="c1">
            <singer id="s1">
                <name>Kate</name>
                <surname>Apple</surname>
            </singer>
        <title>Great CD</title>
        </cd>
        <cd id="c2">
            <singer id="s2">
                <name>Mary</name>
                <surname>Orange</surname>
            </singer>
        <title>Even better CD</title>
        </cd>
    </catalog>
</library>

Umiem stworzyć plik dla niego plik XSLT, ale tylko wtedy gdy pozbędę się lini:

 <library xmlns="http://void.net/library/1.0"> 
...
</library>.

Te dwie linie mówią o przestrzeni nazw (namespace) w pliku XML. Czytałem nieco o tym, ale nie potrafię tak zmodyfikować pliku XSLT aby wszystko działało. Mój w pełni działający plik XSLT (bez przestrzeni nazw):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no" />
<xsl:template match="/catalog">
    <xsl:text>singer,title
</xsl:text>
    <xsl:for-each select="cd">
        <xsl:value-of select="concat(singer/name, ' ', singer/surname, ', ', title, '
')" />
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>
1

Usunięcie tych linii to nie rozwiązanie. To nie linie są problemem, tylko to, że masz tam przestrzeń nazw. Wtedy selektory w XSL nie działają, bo dotyczą domyślnej przestrzeni, a nie tej, która jest w XML. Rozwiązanie jest takie, że w XSL musisz zdefiniować prefiks dla tej przestrzeni. W głównym elemencie dodaj atrybut
xmlns:ns1="http://void.net/library/1.0" i teraz w selektorach pisz <xsl:template match="ns1:library/ns1:catalog"> albo match="ns1:catalog". Wtedy definujesz sobie prefix do twojej przestrzeni jako ns1, a xsl jest prefiksem do przestrzeni nazw XSLT.

0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xmlns:ns1="http://void.net/library/1.0"
<xsl:output method="text" indent="no" />
<xsl:template match="**ns1:catalog**">
<xsl:text>singer,title
</xsl:text>
<xsl:for-each select="**ns1:cd**">
<xsl:value-of select="concat(**ns1:singer/ns1:name, ' ', ns1:singer/ns1:surname, ', ', ns1:title**, '
')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Próbowałem także w ten sposób:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
**xmlns:ns1="http://void.net/library/1.0"**
<xsl:output method="text" indent="no" />
<xsl:template match="**ns1:catalog**">
<xsl:text>singer,title
</xsl:text>
<xsl:for-each select="**ns1:cd"**>
<xsl:value-of select="concat(singer/name, ' ', singer/surname, ', ', title, '
')" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Czytałem o przestrzeni nazw m.in. na SO i te uwagi są dokładnie takie same jak podane przez użytkownika chodnik. Prosiłbym o nakierowanie mnie, co robię nie tak.

0

Nie wiem po co te gwiazdki masz dookoła, wywal je. W tym pierwszym wariancie masz tak:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xmlns:ns1="http://void.net/library/1.0"

a powinno być tak:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="http://void.net/library/1.0">

Nowe linie nie mają znaczenia, ale je wywaliłem dla jasności. Ważne, żeby to xmlns:ns1 było atrybutem w tagu xsl:stylesheet, a nie było sobie gdzieś tam.

0

Dziękuję, teraz wszystko jasne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0