Resultado

Resultado

Estoy intentando generar los valores de ciertos elementos en una fuente RSS como columnas. La estructura del feed RSS en cuestión es la siguiente (abreviada):

$ 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

Después de aplicar un comando xmlstarlet sel con una plantilla, me gustaría ver una lista de títulos de elementos y sus fechas de publicación organizados en columnas.

$ 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
                               (...)

Este problema parece bastante trivial y pensé que podría ser una buena idea comprobarlo.la guía del usuario. Resulta que el ejemplo de Hola mundo con una hoja de estilo .xls proporciona medios para lograr el efecto deseado con poco esfuerzo:

<?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>

Obtengo el resultado deseado con el comando transform, pero encuentro este enfoque bastante engorroso porque xml/xls es muyverboso. Mi objetivo es observar rápidamente algunos elementos en el xml, no quiero escribir una hoja de estilo de ~450 caracteres solo para eso.

$ 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;
(...)

Sería más útil si hubiera una manera de concatenar dos valores de cada <item>elemento en <channel>una línea separada sin recurrir a hojas de estilo xls o editores de flujo externos como sed y awk.

Respuesta1

La hoja de estilo xls proporciona una pista.

La hoja de estilo de ejemplo original tiene, xsl:for-each select="/"mientras que la de la pregunta tiene
select="rss/channel/item". Usando la misma lógica, simplemente haga coincidir rss/channel/item e imprima cada título, pubDate con un delimitador:

$ xmlstarlet sel -t           \
     -m rss/channel/item      \
        -v title -o '^'       \
        -v pubDate            \
        -n ~/tmp/spotn-rss-20140323 |
  column -ts^

Resultado

 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

información relacionada