В этом посте показано, как преобразовать простой файл XML в CSV с помощью XSLT.
Рассмотрим следующий пример XML:
01
02
03
04
05
06
07
08
09
10
11
12
|
< library > < book > < author >Dan Simmons</ author > < title >Hyperion</ title > < publishDate >1989</ publishDate > </ book > < book > < author >Douglas Adams</ author > < title >The Hitchhiker's Guide to the Galaxy</ title > < publishDate >1979</ publishDate > </ book > </ library > |
Это желаемый выход CSV:
1
2
3
|
author,title,publishDate Dan Simmons,Hyperion,1989 Douglas Adams,The Hitchhiker's Guide to the Galaxy,1979 |
Следующая таблица стилей XSL (совместимая с XSLT 1.0) может использоваться для преобразования XML в CSV. Он довольно универсален и может быть легко настроен для обработки различных элементов XML путем изменения списка полей, определенных в начале.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
<? xml version = "1.0" encoding = "utf-8" ?> < xsl:output method = "text" /> < xsl:variable name = "delimiter" select = "','" /> <!-- define an array containing the fields we are interested in --> < xsl:variable name = "fieldArray" > < field >author</ field > < field >title</ field > < field >publishDate</ field > </ xsl:variable > < xsl:param name = "fields" select = "document('')/*/xsl:variable[@name='fieldArray']/*" /> < xsl:template match = "/" > <!-- output the header row --> < xsl:for-each select = "$fields" > < xsl:if test = "position() != 1" > < xsl:value-of select = "$delimiter" /> </ xsl:if > < xsl:value-of select = "." /> </ xsl:for-each > <!-- output newline --> < xsl:text > </ xsl:text > < xsl:apply-templates select = "library/book" /> </ xsl:template > < xsl:template match = "book" > < xsl:variable name = "currNode" select = "." /> <!-- output the data row --> <!-- loop over the field names and find the value of each one in the xml --> < xsl:for-each select = "$fields" > < xsl:if test = "position() != 1" > < xsl:value-of select = "$delimiter" /> </ xsl:if > < xsl:value-of select = "$currNode/*[name() = current()]" /> </ xsl:for-each > <!-- output newline --> < xsl:text > </ xsl:text > </ xsl:template > </ xsl:stylesheet > |
Давайте попробуем это:
1
2
3
4
|
$ xsltproc xml2csv.xsl books.xml author,title,publishDate Dan Simmons,Hyperion,1989 Douglas Adams,The Hitchhiker's Guide to the Galaxy,1979 |
Ссылка: | Преобразование XML в CSV с использованием XSLT 1.0 от нашего партнера по JCG Фахда Шарифа в блоге fahd.blog . |