Преобразовать строку даты в формате (день, месяц, год-время) из формата xml в формат даты в xslt - PullRequest
0 голосов
/ 26 апреля 2018

Как мне преобразовать строковую дату "среда, 25 апреля 2018 - 11:00" из входного XML в формат 2018-04-25 11:00 в моем коде xslt.

Следующее - это входной XML, который поступает из RSS-канала и не может быть изменен.

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="https://www.hhs.gov/rss/news.xml" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Latest News Releases</title>
        <link>https://www.hhs.gov/rss/news.xml</link>
        <description>HHS News Releases</description>
        <language>en</language>
        <atom:link href="https://www.hhs.gov/rss/news.xml" rel="self" type="application/rss+xml" />
        <item>
            <title>Secretary Azar, Surgeon General Adams Praise Private Sector Support for Naloxone Advisory</title>
            <link>https://www.hhs.gov/about/news/2018/04/25/secretary-azar-surgeon-general-adams-praise-private-sector-support-naloxone-advisory.html</link>
            <description>&lt;p&gt;Following the early April release of the Surgeon General’s Advisory on Naloxone and Opioid Overdose
            </description>
            <pubDate>Wednesday, April 25, 2018 - 11:00</pubDate>
            <dc:creator>HHS Press Office</dc:creator>
            <guid isPermaLink="true">https://www.hhs.gov/about/news/2018/04/25/secretary-azar-surgeon-general-adams-praise-private-sector-support-naloxone-advisory.html</guid>
        </item>
    </channel>
</rss>

Вот XSL, который я написал

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"

    exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/rss">
        <Records>
            <xsl:apply-templates select="channel/item" /> 
        </Records>

    </xsl:template>      

    <xsl:template match="channel/item">
        <xsl:element name="Record">
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>    

    <xsl:template match="*">        
        <xsl:element name="{local-name()}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>  

    <xsl:template match="@*">
        <xsl:attribute name="{local-name()}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet> 

Вывод, который я получаю, ниже. Обратите внимание, что в качестве строки указывается дата, из-за которой мой канал перестает работать. Как преобразовать строковую дату «среда, 25 апреля 2018 - 11:00» в формат 2018-04-25 11:00 AM

<Record>
            <title>Secretary Azar, Surgeon General Adams Praise Private Sector Support for Naloxone Advisory</title>
            <link>https://www.hhs.gov/about/news/2018/04/25/secretary-azar-surgeon-general-adams-praise-private-sector-support-naloxone-advisory.html</link>
            <description>&lt;p&gt;Following the early April release of the Surgeon General’s Advisory on Naloxone and Opioid Overdose
            </description>
            <pubDate>Wednesday, April 25, 2018 - 11:00</pubDate>
            <creator>HHS Press Office</creator>
            <guid isPermaLink="true">https://www.hhs.gov/about/news/2018/04/25/secretary-azar-surgeon-general-adams-praise-private-sector-support-naloxone-advisory.html</guid>
        </Record>

1 Ответ

0 голосов
/ 26 апреля 2018

Поскольку у вас, кажется, есть доступ к пространству имен MSXSL, вы можете добавить в таблицу стилей XSL расширение сценария, которое выполняет преобразование даты на более подходящем языке программирования (см. MSDN ).

Для примера давайте использовать JScript, но использование языков .NET в блоке сценария также возможно (см. MSDN ).

Далее используется блок <msxsl:script> для определения функции convertDate(), которая впоследствии будет использоваться в вашем коде XSLT с префиксом. Он преобразует действительные даты в этом формате "Wednesday, April 25, 2018 - 11:00" в "2018-04-25 11:00". Все, что он не может преобразовать, он возвращает без изменений.

<msxsl:script> разрешено на том же уровне, где находятся элементы <xsl:template>.

<msxsl:script language="JScript" implements-prefix="script">
<![CDATA[

// converts dates like this one: "Wednesday, April 25, 2018 - 11:00"
// to "2018-04-25 11:00"
function convertDate(text) {
    var m = text.match(/[a-z]+, ([a-z]+) (\d{1,2}), (\d{4}) - (\d\d:\d\d)/i),
        zero = function (s) { return ('0' + s).slice(-2); },
        dateStr, date;

    if (m) {
        dateStr = [m[2], m[1], m[3], m[4]].join(' ');
        date = new Date(Date.parse(dateStr));
        if (date) {
            return [
                date.getFullYear(),
                '-',
                zero(date.getMonth() + 1),
                '-',
                zero(date.getDate()),
                ' ',
                zero(date.getHours()),
                ':',
                zero(date.getMinutes())
            ].join('');
        }
    }
    return text;
}

]]>
</msxsl:script>

<xsl:template match="pubDate">
    <xsl:copy>
        <xsl:value-of select="script:convertDate(.)"/>
    </xsl:copy>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...