Ergebnis

Ergebnis

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

verwandte Informationen