Есть несколько проблем с 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>
.