2015-07-16 79 views
7

我有一个带有研讨会的XML文件,我想提供给Google日历。 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> 

最明显的方式实现这一目标,我会说,是用它处理XML和建立一些文件谷歌XSLT样式表-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),并在导入到一些日历谷歌日历。 产生的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)我不知道,如果这种方法会自动将“产生错误抓取更改“,因为它需要偶尔重新加载XML。

那么,有没有办法让谷歌(或网络服务器)处理这个文件,因此它被识别为一个iCal文件,保持最新?

最后一个小问题是原始的XML里面还有一个不同的XSL文件。有没有一种简单的方法可以将我的网站上的符号链接制作成这个文件,或者包含没有标题的XML,这样我就可以用我的原来的XSL替换原来的XSL了?

回答

1

最简单的解决方案可能是在Web服务器上创建一个从xml转换为ical的CGI。如果在Linux Web服务器运行,则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) 

我还创建了一个.htacces$文件上diretory以确保seminars脚本处理为CGI

<Files seminars> 
    SetHandler cgi-script 
</Files>