Создать новый XML из XSLT - PullRequest
       4

Создать новый XML из XSLT

0 голосов
/ 18 октября 2018

У меня в настоящее время есть этот рабочий код: (tvdata.xslt)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/tv_guide">
            <tv>
                <xsl:for-each select="document('cmore.xml')/tv/programme">
                    <programme>
                            <title>
                                <xsl:value-of select="title" />
                            </title>
                            <xsl:for-each select="category">
                                <category>
                                    <xsl:value-of select="text()"/>
                                </category>
                            </xsl:for-each>
                    </programme>
                </xsl:for-each>
            </tv>
     </xsl:template>    
</xsl:stylesheet>

(tv-guide.xml)

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="tvdata.xslt"?>
<tv_guide>
</tv_guide>

Где cmore.xml - это XML-файл изhttp://xmltv.xmltv.se. Я хочу сгенерировать новый XML-файл с данными в XSLT-файле с корневым каталогом tv_guide.Я пытался использовать результат-документ, но он выдает ошибку.

1 Ответ

0 голосов
/ 18 октября 2018

С небольшими изменениями ваш XSLT-файл будет работать хорошо.Я добавил переменную для обозначения имени файла входных данных программы, а также выходных данных программы.Таким образом, XSLT может выглядеть так:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:variable name="curFile" select="'first.cmore.dk_2018-10-10.xml'" />
    <xsl:variable name="outFile" select="'cmore.out.xml'" />

    <xsl:template match="text()" />

    <xsl:template match="/">
        <xsl:result-document href="{$outFile}" method="xml">
            <tv>
                <xsl:for-each select="document($curFile)/tv/programme">
                    <programme>
                            <title>
                                <xsl:value-of select="title" />
                            </title>
                            <xsl:for-each select="category">
                                <category>
                                    <xsl:value-of select="text()"/>
                                </category>
                            </xsl:for-each>
                    </programme>
                </xsl:for-each>
            </tv>
        </xsl:result-document>
     </xsl:template>    
</xsl:stylesheet>

Выходной файл обозначен переменной outFile.Если вы хотите изменить это на входной параметр, измените эту строку на <xsl:param name="outFile" /> и передайте параметр в качестве входного параметра в таблицу стилей.

Чтобы это работало, вы должны удалить строку определения DTD изXML файл (я его не нашел) или добавьте DTD-файл в рабочий каталог (если вы знаете, где его можно получить).

Однако таким образом вы, вероятно, сможете преобразовать все XMLфайлы по указанной ссылке.

Если вы хотите динамически указывать имя файла XML, измените xsl:variable на xsl:param и передайте соответствующий параметр процессору XSLT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...