xml - 将 XML 馈送到 Google 日历

标签 xml csv xslt

我有一个包含研讨会的 XML 文件,我想将其提供给 google-calendar。 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 文件:“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 .

那么,有没有办法让谷歌(或网络服务器)处理这个文件,以便将其识别为 iCal 文件,使其保持最新?

最后一个小问题是原始 XML 内部有一个不同的 XSL 文件。有没有一种简单的方法可以在我的网站上创建指向该文件的符号链接(symbolic link),或者包含没有 header 的 XML,这样我就可以用我的 XSL 替换原来的 XSL?

最佳答案

最简单的解决方案可能是在您的 Web 服务器上创建一个 CGI,将 xml 转换为 ical。如果您的 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 header 。最后一行使用 XSLt 转换进行转换。请注意,处理指令引起的错误将被忽略(重定向到/dev/null)。

请注意,您的服务器必须配置为运行 CGI。我在 Apache 2 上对其进行了测试,需要

 chmod 755 seminars          # make CGI file executable
 chmod . 711                 # close directory to others (suexec)  

我还在目录中创建了一个.htacces$ 文件以确保seminars 脚本作为CGI 进行处理

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

关于xml - 将 XML 馈送到 Google 日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31502384/

相关文章:

ios - 将 NSData 转换为 NSDictionary

字段中的 Python csv 换行符

c# - 在 XSLT 中最后一次出现字符后获取子字符串

java - 使用 java 进行 XSL 解析

xslt - 为什么 XSLT 似乎激怒了这么多人?

c# - 如何获取 xml 节点名称和内部文本和填充 GridView

xml - relaxng:模式定义无效?

android - 如何确定手机是否有缺口

c# - DataGrid Wpf 中的 CSV/文本

excel - 当平面文件中的列和行不匹配时,如何解决(使用)ETL