1

У меня есть 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">&#13;&#10;</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 своим?

Извините за длинный вопрос. Заранее спасибо.

0