Utworzenie XSL z pliku XML

Anzor
2017-08-17 15:57
Anzor
0

Cześć,
mam plik XML

<?xml version="1.0" encoding="utf-8"?>
<library xmlns="http://example.net/library/1.0">
    <books>
        <book id="b1">
            <author id="a1">
                <name>Henryk</name>
                <surname>Kowalski</surname>
                <born>1991-01-23</born>
            </author>
            <title>"Do okoła Ziemi"</title>
            <published>1993</published>
            <isbn>985-12-23-15489-23</isbn>
        </book>
        <book id="b2">
            <author id="a2">
                <name>Franek</name>
                <surname>Brzeczyszczykiewicz</surname>
                <born>1975-09-05</born>
                <died>1999-12-30</died>
            </author>
            <title>Jak rozpetałem II wojnę światową</title>
            <published>1968</published>
        </book>
    </books>
</library>

oraz plik XSL

<?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="/books">
      <xsl:text>author,title,published
</xsl:text>
    <xsl:for-each select="book">
        <xsl:value-of select="concat(author/name, ', ', author/surname, ', ', title, ', ', published, ' ')" />
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Nie mogę znaleźć błędu. W wyniku dostaje całą zawartość pliku XML, a nie określone pola. Mógłby mi ktoś podpowiedzieć, gdzie jest błąd?

edytowany 1x, ostatnio: furious programming, 2017-08-17 16:52

Pozostało 580 znaków

2017-08-17 16:48

Rejestracja: 5 lat temu

Ostatnio: 1 minuta temu

0

Najwyraźniej żaden template nie został zlokalizowany i zostały zastosowane domyślne (zgodnie ze specyfikacją).

Spróbuj 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="text" indent="no" />

    <xsl:template match="//books">
        <xsl:text>author,title,published</xsl:text>
        <xsl:for-each select="book">
            <xsl:text>
</xsl:text>
            <xsl:value-of select="concat(author/name, ', ', author/surname, ', ', title, ', ', published, ' ')" />
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>
edytowany 1x, ostatnio: furious programming, 2017-08-17 16:52

Pozostało 580 znaków

Anzor
2017-08-17 16:53
Anzor
0

Nadal wyświetla mi wszystkie dane z pliku XML.

Pozostało 580 znaków

2017-08-18 08:13

Rejestracja: 5 lat temu

Ostatnio: 1 minuta temu

0
Anzor napisał(a):

Nadal wyświetla mi wszystkie dane z pliku XML.

Dobra, już widzę. Ja zastosowałem lekką modyfikację XMLa, tj. wyciąłem namespaca, więc żeby to działało:

1) W XMLu możesz wyciąć namespace i to samo w XSLu.

Zmieniasz:

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

na

<library>

albo

2) W XMLu zostawiasz namespace i wówczas dopasowanie powinno go uwzględniać to, że w XSL odwołujesz się do innego namespace.

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

    <xsl:template match="ns1:library/ns1:books">
        <xsl:text>author,title,published</xsl:text>
        <xsl:for-each select="ns1:book">
            <xsl:text>/xsl:text>
            <xsl:value-of select="concat(ns1:author/ns1:name, ', ', ns1:author/ns1:surname, ', ', ns1:title, ', ', ns1:published, ' ')" />
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

Pozostało 580 znaków

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