Как включить файл XSL в другой файл XSL - PullRequest
0 голосов
/ 03 мая 2018

Мне нужна эта 2.xsl функция использования файла для изменения формата даты (тег <Date>) из файла 1.xsl. Я пользуюсь инструкцией <xsl:include>, но не знаю, что мне следует изменить.

Вот мой XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
<ClientList>
    <Client>
        <Name>Jan</Name>
        <Surname>Kowalski</Surname>
        <Date>2018-03-23</Date>
    </Client>
    <Client>
        <Name>Piotr</Name>
        <Surname>Nowak</Surname>
        <Date>2018-04-25</Date>
    </Client>
</ClientList>

Мой 1.xsl файл с функцией изменения формата даты:

<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <Date>
        <xsl:value-of select="concat(substring(Date, 9, 2), '-', substring(Date, 6, 2), '-', substring(Date, 1, 4))"/>
    </Date>
</xsl:stylesheet>

Вот мой 2.xsl файл (мне нужно, чтобы этот файл использовал функцию из 1.xsl):

<?xml version='1.0'?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:include href="1.xsl"/>

    <xsl:template match="/">
        <ClientList>
            <xsl:for-each select="ClientList/Client">
                <Client>
                    <NameSurname>
                        <xsl:value-of select="concat(Name, ' ' , Surname)"/>
                    </NameSurname>
                </Client>
            </xsl:for-each>
        </ClientList>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

0 голосов
/ 04 мая 2018

Есть несколько проблем с XSL, созданными и справедливо отмеченными @Martin Honnen в его комментарии, относящемся к 1.xsl.

Логика преобразования формата <Date> должна быть заключена в <xsl:template> или <xsl:function>. Ниже обновленный 1.xsl, который использует <xsl:template>.

<xsl:template name="DateConvertor">
    <Date>
        <xsl:value-of select="concat(substring(Date, 9, 2), '-', substring(Date, 6, 2), '-', substring(Date, 1, 4))"/>
    </Date>
</xsl:template>

В 2.xsl вы включаете utils.xsl, который, я считаю, соответствует 1.xsl. В этом XSL вам необходимо вызвать шаблон или функцию, которые вы создали во включенном XSL.

<xsl:template match="/">
    <ClientList>
        <xsl:for-each select="ClientList/Client">
            <Client>
                <NameSurname>
                    <xsl:value-of select="concat(Name, ' ', Surname)" />
                </NameSurname>
                <xsl:call-template name="DateConvertor" /> <!-- call the template here -->
            </Client>
        </xsl:for-each>
    </ClientList>
</xsl:template>

РЕДАКТИРОВАТЬ - Изменения в использовании <xsl:function>

XSLT 2.0 позволяет писать собственные функции, используя <xsl:function>. Функции могут использоваться для выполнения любой вычислительной логики, и они возвращают значения, основанные на вычислениях. Параметры могут быть переданы в функцию с помощью <xsl:param>. Функции должны быть связаны с пространством имен, которое отличается от пространства имен XSLT.

1.xsl необходимо изменить, чтобы включить функцию, которая принимает один параметр типа string и возвращает значение типа string.

<xsl:function name="ex:DateConvertor" as="xs:string">
    <xsl:param name="InputDate" as="xs:string" />
    <xsl:value-of select="concat(substring($InputDate, 9, 2), '-', substring($InputDate, 6, 2), '-', substring($InputDate, 1, 4))"/>
</xsl:function>

Эта функция связана с пространством имен xmlns:ex="http://canbeanything". Кроме того, поскольку типы данных используются для параметра и возвращаемого значения, вам также необходимо определить пространство имен xmlns:xs="http://www.w3.org/2001/XMLSchema".

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ex="http://canbeanything">

Изменения в 2.xsl для вызова функции ex:DateConvertor.

Сопоставить пространство имен, необходимое для функции.

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ex="http://canbeanything">

Вызовите функцию и передайте Date значение в качестве параметра

<xsl:template match="/">
    <ClientList>
        <xsl:for-each select="ClientList/Client">
            <Client>
                <NameSurname>
                    <xsl:value-of select="concat(Name, ' ', Surname)" />
                </NameSurname>
                <!-- Function Call -->
                <!-- passing value of 'Date' as parameter -->
                <Date>
                    <xsl:value-of select="ex:DateConvertor(Date)" /> 
                </Date>
            </Client>
        </xsl:for-each>
    </ClientList>
</xsl:template>

Требуемый вывод может быть достигнут в одном XSL, но я предполагаю, что это этап обучения, и приведенное выше, вероятно, является примером <xsl:include>.

...