xml - example - xslt tutorial
La transformaciĆ³n XSLT no funciona hasta que elimine el nodo raĆz (3)
Estoy tratando de extraer el título del siguiente XML del servicio web Met Office usando XSLT, sin embargo, mi selección XSLT vuelve 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 inclinada antes de FcstPeriods, pero nada funciona hasta que elimino la primera y última línea del XML de origen, luego funciona perfectamente.
Esto está bien en las pruebas, pero, por supuesto, quiero usar el servicio web proporcionado por Met Office y así es como lo presentan.
¿Algunas ideas?
A continuación se muestra el cambio simple necesario en su xsl.
from:
<xsl:value-of select="FcstPeriods/Period/Paragraph"/>
a:
<xsl:value-of select="//*:FcstPeriods/*:Period/*:Paragraph"/>
Hay 2 errores en su XSL:
-
<xsl:value-of select="FcstPeriods/Period/Paragraph"/>
nunca seleccionará nada porque<RegionalFcst>
y todos sus elementos secundarios tienen espacios de nombres (xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst"
). -
<xsl:template match="/">
no coincidirá con<RegionalFcst>
pero coincidirá con su elemento primario, el elemento de documento (invisible).<RegionalFcst>
es el primer y único hijo de/
.
Para que su XSL funcione correctamente, debería verse así:
<?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="*[local-name()=''RegionalFcst'']/*[local-name()=''FcstPeriods'']/*[local-name()=''Period'']/*[local-name()=''Paragraph'']"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
El problema : su XML coloca sus elementos en un espacio de nombres .
Solución : declare el mismo espacio de nombres en su hoja de estilo, asígnele un prefijo y use ese prefijo para abordar los elementos en el XML de origen:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:met="www.metoffice.gov.uk/xml/metoRegionalFcst"
exclude-result-prefixes="met">
<xsl:template match="/">
<html>
<body>
<xsl:value-of select="met:RegionalFcst/met:FcstPeriods/met:Period/met:Paragraph[@title=''Headline:'']"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>