Necesitaba usar XSL para generar un resultado de texto simple desde XML. Como no encontré ningún ejemplo bueno y conciso en línea, decidí publicar mi solución aquí. Cualquier enlaces en referencia a un ejemplo mejor sería, por supuesto, se apreciará:use xsl para enviar texto sin formato
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:for-each select="script/command" xml:space="preserve">at -f <xsl:value-of select="username"/> <xsl:value-of select="startTime/@hours"/>:<xsl:value-of select="startTime/@minutes"/> <xsl:value-of select="startDate"/><xsl:text>
</xsl:text></xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Algunas cosas importantes que me han ayudado aquí:
- el uso de XSL: salida de omitir la declaración normalizada al principio del documento de salida
- el uso del atributo xml: space = "preserve" para conservar cualquier espacio en blanco que haya escrito dentro de la etiqueta xsl: for-each. Esto también me obligó a escribir todo el código dentro de la etiqueta for-each, incluyendo esa etiqueta también, en una sola línea (con la excepción del salto de línea).
- el uso de para insertar un salto de línea - nuevamente tuve que omitir sangría xml estándar aquí.
El resultante y de salida deseado para este XSLT fue:
en Alluser -f 23:58 17.4.2010
en ggroup67 -f 07:58 28.4.2010
en -f ggroup70 15: 58 18.4.2010
en Alluser -f 23:58 18.4.2010
en ggroup61 -f 7:58 22.9.2010
en -f ggroup60 23:58 21.9.2010
en Alluser -f 03:58 22,9 .2010
Como dije, cualquier sugerencia de cómo hacer esto de manera más elegante sería apreciada.
SEGUIMIENTO 2011-05-08:
Este es el tipo de XML estoy tratando a:
<script xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="script.xsd">
<command>
<username>alluser</username>
<startTime minutes="58" hours="23"/>
<startDate>17.4.2010</startDate>
</command>
</script>
Puede ahorrar en el número de elementos '' usando 'concat ('at -f', username, '', startTime/@ hours, '', ...)'. Además, podría envolver su código fuente; si lo hace dentro de las etiquetas, no afectará la salida. –
Buena pregunta, +1. Vea mi respuesta para una solución completa, muy corta y realmente genérica. –
@Christopher Creutzig: Gracias por la gran sugerencia sobre concat(). ¿A qué te refieres con "envolver tu código fuente"? – Chris