在删除根节点之前,XSLT Transform不起作用

时间:2016-01-13 04:36:11

标签: xml xslt

我正在尝试使用XSLT从Met Office Web服务中提取下面的XML标题,但是我的XSLT选择返回空白。

来源:

<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中删除第一行和最后一行之前没有任何作用 - 然后它完美地运作。

这在测试中很好,但当然我想使用Met Office提供的Web服务,这就是他们如何呈现它。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

问题:您的XML将其元素放在命名空间中。

解决方案:在样式表中声明相同的命名空间,为其指定前缀并使用该前缀来处理源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>

答案 1 :(得分:-1)

以下是xsl中所需的简单更改。

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

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

答案 2 :(得分:-1)

您的XSL中有2个错误:

  1. <xsl:value-of select="FcstPeriods/Period/Paragraph"/>永远不会选择任何内容,因为<RegionalFcst>及其所有子元素都是命名空间(xmlns="www.metoffice.gov.uk/xml/metoRegionalFcst")。
  2. <xsl:template match="/"><RegionalFcst>不匹配,但会匹配其父级(不可见)文档元素。 <RegionalFcst>/的第一个也是唯一的孩子。
  3. 为了使您的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>