XSLT Transform no funciona hasta que elimino el nodo raíz

Resuelto hazymat asked hace 8 años • 2 respuestas

Estoy intentando extraer el título del siguiente XML del servicio web de Met Office usando XSLT, sin embargo, mi selección XSLT aparece en blanco.

FUENTE:

<RegionalFcst xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst" createdOn="2016-01-13T02:14:39" issuedAt="2016-01-13T04:00:00" regionId="se">
 <FcstPeriods>
  <Period id="day1to2">
   <Paragraph title="Headline:">Frosty start. Bright or sunny day.</Paragraph>
   <Paragraph title="Today:">A clear and frosty start in west, but cloudier in Kent with isolated showers. Then dry with sunny periods. Increasing cloud in west later will bring coastal showers with freshening southerly winds. Chilly inland, but less cold near coasts. Maximum Temperature 8C.</Paragraph>
  </Period>
 </FcstPeriods>
</RegionalFcst>

Mi XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
   <xsl:value-of select="FcstPeriods/Period/Paragraph"/>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Cambié la raíz a /RegionalFcst e intenté otros cambios similares, como agregar una barra diagonal antes de FcstPeriods, pero nada funciona hasta que elimino la primera y la última línea del XML fuente; entonces funciona perfectamente.

Esto está bien en las pruebas, pero, por supuesto, quiero utilizar el servicio web proporcionado por Met Office y así es como lo presentan.

¿Algunas ideas?

hazymat avatar Jan 13 '16 11:01 hazymat
Aceptado

Además de la respuesta de "michael.hor257k", existe otra solución para la versión 2.0 de XSLT.

XSLT 2.0

Utilice xpath-default-namespaceatributo. Para el ejemplo anterior se ve así:

<xsl:stylesheet xpath-default-namespace="www.metoffice.gov.uk/xml/metoRegionalFcst" ... >

Entonces no es necesario repetir el prefijo del espacio de nombres en cada elemento al que hace referencia XPath:

<xsl:value-of select="FcstPeriods/Period/Paragraph"/>

en lugar de

<xsl:value-of select="met:FcstPeriods/met:Period/met:Paragraph"/>
30thh avatar Oct 04 '2021 07:10 30thh