Utworzenie XSL z pliku XML

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?

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

Nadal wyświetla mi wszystkie dane z pliku XML.

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

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

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