我有一个包含研讨会的XML文件,我想将其提供给谷歌日历。 XML文件由其他人维护并定期更新,因此我想以谷歌自动获取这些更改的方式执行此操作。
我对这类事情没有多少经验,所以我希望有人能指出我正确的方向。
这是我想要处理的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文件:&#34; ical.xsl&#34;)
<?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)谷歌不处理XML,因此在导入时产生错误;(2)我不确定这种方法是否会自动&#34;抓住变化&#34;因为它需要偶尔重新加载XML。
那么,有没有办法让谷歌(或网络服务器)处理这个文件,因此它被识别为iCal文件,和让它保持最新?
最后一个小问题是原始XML里面有一个不同的XSL文件。有没有一种简单的方法可以将我的网站上的符号链接添加到此文件中,或者包含没有标题的XML,以便我可以用我的原始XSL替换它?
答案 0 :(得分:1)
最简单的解决方案可能是在您的Web服务器上创建一个从xml转换为ical的CGI。如果您的Web服务器在Linux上运行,那么CGI可以像下面的文件一样简单(我称之为seminars
)
#!/usr/bin/sh
echo Content-type: text/calendar
echo
/usr/bin/xsltproc ical.xsl seminars.xml 2> /dev/null
此CGI脚本由Bourne shell处理。这是由第一行指定的。以下2行使用ical日历的媒体类型(mime类型)最终确定HTTP标头。最后一行使用您的XSLt转换进行转换。请注意,将忽略由于处理指令引起的错误(重定向到/ dev / null)。
请注意,您的服务器必须配置为运行CGI。我在Apache 2上进行了测试,需要
chmod 755 seminars # make CGI file executable
chmod . 711 # close directory to others (suexec)
我还在diretory上创建了一个.htacces$
文件,以确保将seminars
脚本作为CGI处理
<Files seminars>
SetHandler cgi-script
</Files>