我正在嘗試將 RSS 提要中某些元素的值作為列輸出。所討論的 RSS 提要的結構是這樣的(縮寫):
$ xmlstarlet el ~/tmp/spotn-rss-20140323 | sort -u
rss/channel/title
rss/channel/item/content
rss/channel/item/description
rss/channel/item/link
rss/channel/item/pubDate
rss/channel/item/title
在使用模板應用 xmlstarlet sel 命令後,我希望看到按列排列的專案標題及其發布日期的清單。
$ xmlstarlet sel -t \
-v rss/channel/item/title \
-v rss/channel/item/pubDate -n ~/tmp/spotn-rss-20140323
Desired output: Actual output:
title1:pubDate1 title1
title2:pubDate2 title2
title3:pubDate3 title3
(...) (...)
pubDate1
pubDate2
pubDate3
(...)
這個問題看起來相當微不足道,我認為檢查一下可能是個好主意使用者指南。事實證明,帶有 .xls 樣式表的 hello world 範例提供了輕鬆實現所需效果的方法:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:param name="inputFile">-</xsl:param>
<xsl:template match="/">
<xsl:call-template name="t1"/>
</xsl:template>
<xsl:template name="t1">
<xsl:for-each select="rss/channel/item">
<xsl:value-of select="title" />^<xsl:value-of select="pubDate" />;
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我使用轉換命令獲得了所需的輸出,但我發現這種方法相當麻煩,因為 xml/xls 非常麻煩囉嗦的。我的目標是快速查看 xml 中的某些元素,我不想為此編寫約 450 個字元的樣式表。
$ xmlstarlet tr /home/jaroslav/tmp/spotn-rss-style.xls \
/home/jaroslav/tmp/spotn-rss-20140323 |
column -ts^
Test Thu, 20 Mar 2014 18:58:11 +0000;
Assisterende borer – Songa Offshore Thu, 20 Mar 2014 12:48:03 +0000;
Maskinsjef Thu, 20 Mar 2014 10:23:16 +0000;
Maskinsjefer/Motorpassere Sun, 16 Mar 2014 16:37:15 +0000;
Skipsfører Sun, 16 Mar 2014 16:30:19 +0000;
Tilkallingsvikarar matros Thu, 13 Mar 2014 03:15:55 +0000;
Matros Wed, 12 Mar 2014 13:05:57 +0000;
1. styrmann Tue, 11 Mar 2014 05:44:31 +0000;
Overstyrmann Scan Trans Tue, 04 Mar 2014 06:35:29 +0000;
(...)
如果有一種方法可以將每個<item>
元素的兩個值連接在<channel>
單獨的行上,而無需借助 xls 樣式表或外部流編輯器(例如 sed 和 awk),那麼這將是最有用的。
答案1
xls 樣式表提供了線索。
原始範例樣式表具有 ,xsl:for-each select="/"
而問題中的樣式表具有
select="rss/channel/item"
。使用相同的邏輯,只需匹配 rss/channel/item 並使用分隔符號列印每個標題、pubDate:
$ xmlstarlet sel -t \
-m rss/channel/item \
-v title -o '^' \
-v pubDate \
-n ~/tmp/spotn-rss-20140323 |
column -ts^
結果
Test Thu, 20 Mar 2014 18:58:11 +0000
Assisterende borer – Songa Offshore Thu, 20 Mar 2014 12:48:03 +0000
Borer – Boring – Songa Offshore Thu, 20 Mar 2014 12:42:57 +0000
Hydrauliker – Songa Offshore Thu, 20 Mar 2014 12:34:56 +0000