У меня есть XML-файл с семинарами, который я хотел бы передать в Google-календарь. XML-файл поддерживается кем-то другим и регулярно обновляется, поэтому я хотел бы сделать это таким образом, чтобы Google автоматически собирал эти изменения. У меня нет особого опыта в таких вещах, поэтому я надеюсь, что кто-то может указать мне правильное направление.
Это пример XML, который я хочу обработать.
(XML-файл: "seminars.xml")
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ical.xsl"?>
<seminars>
<lastupdate>20150707</lastupdate>
<seminar>
<speaker>A. Einstein</speaker>
<location>Zurich</location>
<date>20150607</date>
<time>15:45:00</time>
<university>Princeton</university>
<abstract>
<title>On the structure of generalized patent office spaces</title>
<content>To be announced.</content>
</abstract>
</seminar>
</seminars>
Я бы сказал, что наиболее очевидным способом достижения этого является использование таблицы стилей XSLT, которая обрабатывает XML и создает файл, который может прочитать google-calendar. У меня есть веб-сайт / сервер, на котором я могу разместить этот XSL-файл, поэтому в идеале я надеюсь, что мне удастся сделать только одну загрузку нужного файла.
Лист XSL у меня выглядит следующим образом.
(XSL-файл: "ical.xsl")
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1" media-type="text/calendar"/>
<xsl:variable name="crlf"> </xsl:variable>
<xsl:template match="/">BEGIN:VCALENDAR<xsl:value-of select="$crlf"/>
CALSCALE:GREGORIAN<xsl:value-of select="$crlf"/>
VERSION:2.0<xsl:value-of select="$crlf"/>
SEQUENCE:1<xsl:value-of select="$crlf"/>
X-WR-TIMEZONE:Europe/Paris<xsl:for-each select="seminars/seminar"><xsl:value-of select="$crlf"/>
BEGIN:VEVENT<xsl:value-of select="$crlf"/>
LOCATION:<xsl:value-of select="location"/><xsl:value-of select="$crlf"/>
DTSTART:<xsl:value-of select="date"/>T154500<xsl:value-of select="$crlf"/>
DTEND:<xsl:value-of select="date"/>T164500<xsl:value-of select="$crlf"/>
DESCRIPTION:seminar by <xsl:value-of select="speaker"/><xsl:value-of select="$crlf"/>
SUMMARY:<xsl:value-of select="abstract/title"/><xsl:value-of select="$crlf"/>
END:VEVENT<xsl:value-of select="$crlf"/></xsl:for-each>
END:VCALENDAR<xsl:value-of select="$crlf"/>
</xsl:template>
</xsl:stylesheet>
Это работает, если я обработаю XML-файл, передам его в iCal-файл (xsltproc seminars.xml > mycal.ics
) и импортирую его в какой-либо календарь в google-calendar.
В результате mycal.ics
выглядит следующим образом
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
VERSION:2.0
SEQUENCE:1
X-WR-TIMEZONE:Europe/Paris
BEGIN:VEVENT
LOCATION:Zurich
DTSTART:20150607T154500
DTEND:20150607T164500
DESCRIPTION:seminar by A. Einstein
SUMMARY:On the structure of generalized patent office spaces
END:VEVENT
Теперь проблема в том, что (1) Google не обрабатывает XML, таким образом генерируя ошибку при импорте, и (2) Я не уверен, что этот метод автоматически "захватит изменения", так как это потребовало бы периодической перезагрузки XML.
Итак, есть ли способ заставить Google (или веб-сервер) обрабатывать этот файл, чтобы он распознавался как файл iCal и поддерживал его актуальность?
Наконец, небольшая проблема заключается также и в том, что исходный XML содержит другой XSL-файл. Есть ли простой способ сделать что-то вроде символической ссылки на моем сайте на этот файл или включить XML без заголовка, чтобы я мог просто заменить исходный XSL своим?
Извините за длинный вопрос. Заранее спасибо.