除非删除根节点,否则XSLT转换不起作用
我试图从使用XSLT的Met Office Web服务的下面的XML中提取标题,但是我的XSLTselect返回空白。
资源:
<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>
我的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>
我已经将根目录更改为/ RegionalFcst,并试图进行其他类似的更改,例如在FcstPeriods之前添加一个前导斜杠,但是直到从源XML中删除第一行和最后一行,它才能正常工作,然后才能正常工作。
这在testing中没有问题,但是我当然想使用Met Office提供的Web服务,这就是它们如何呈现的。
有任何想法吗?
问题是 :你的XML把它的元素放在一个名字空间中 。
解决scheme :在样式表中声明相同的名称空间,为其分配一个前缀,并使用该前缀来处理源XML中的元素:
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>
以下是您的xsl所需的简单更改。
来自: <xsl:value-of select="FcstPeriods/Period/Paragraph"/>
到: <xsl:value-of select="//*:FcstPeriods/*:Period/*:Paragraph"/>
你的XSL有两个错误:
-
<xsl:value-of select="FcstPeriods/Period/Paragraph"/>
将永远不会select任何东西,因为<RegionalFcst>
及其所有子元素都是命名空间(xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst"
)。 -
<xsl:template match="/">
不会匹配<RegionalFcst>
但会匹配它的父级(不可见)文档元素。<RegionalFcst>
是/的第一个也是唯一的孩子。
为了让XSL正常工作,它将看起来像这样:
<?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>