Ich versuche, die Werte bestimmter Elemente eines RSS-Feeds als Spalten auszugeben. Der Aufbau des betreffenden RSS-Feeds ist folgender (abgekürzt):
$ 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
Nachdem ich einen xmlstarlet sel-Befehl mit einer Vorlage angewendet habe, möchte ich eine in Spalten angeordnete Liste mit Artikeltiteln und deren Veröffentlichungsdaten sehen.
$ 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
(...)
Dieses Problem scheint eher trivial zu sein, und ich dachte, es wäre eine gute Idee, zu überprüfendas BenutzerhandbuchWie sich herausstellt, bietet das Hallo-Welt-Beispiel mit einem .xls-Stylesheet die Möglichkeit, mit wenig Aufwand den gewünschten Effekt zu erzielen:
<?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>
Ich erhalte die gewünschte Ausgabe mit dem Transform-Befehl, aber ich finde diesen Ansatz ziemlich umständlich, da xml/xls sehrwortreich. Mein Ziel besteht darin, schnell einige Elemente in der XML-Datei anzuschauen und ich möchte nicht nur dafür ein Stylesheet mit ca. 450 Zeichen schreiben.
$ 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;
(...)
Es wäre sehr nützlich, wenn es eine Möglichkeit gäbe, zwei Werte von jedem <item>
Element in <channel>
einer separaten Zeile zu verketten, ohne auf XLS-Stylesheets oder externe Stream-Editoren wie sed und awk zurückgreifen zu müssen.
Antwort1
Einen Anhaltspunkt liefert das xls-Stylesheet.
Das ursprüngliche Beispiel-Stylesheet hat, xsl:for-each select="/"
während das in der Frage hat
select="rss/channel/item"
. Mit derselben Logik gleichen Sie einfach RSS/Kanal/Element ab und drucken jeweils Titel und Veröffentlichungsdatum mit einem Trennzeichen:
$ xmlstarlet sel -t \
-m rss/channel/item \
-v title -o '^' \
-v pubDate \
-n ~/tmp/spotn-rss-20140323 |
column -ts^
Ergebnis
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