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