当前位置: 首页 > 知识库问答 >
问题:

XSLT转换只有在删除根节点后才能工作

司徒运锋
2023-03-14

我试图使用XSLT从Met Office web服务的以下XML中提取标题,但是我的XSLT select返回空白。

资料来源:

<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服务,这就是他们展示它的方式。

有什么想法吗?

共有2个答案

谭鹏云
2023-03-14

除了“michael.hor257k”的答案之外,还有另一个解决方案,即XSLT 2.0版。

XSLT 2.0

使用xpath-default-namesspace属性。对于上面的示例,它看起来像这样:

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

然后,您不需要在XPath引用的每个元素中重复名称空间前缀:

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

而不是

<xsl:value-of select="met:FcstPeriods/met:Period/met:Paragraph"/>
何烨华
2023-03-14

问题:您的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>
 类似资料:
  • 输入: 如何删除列顺序中没有值的记录? 期望输出: 我当前的XSL只删除空节点 我似乎无法掌握模板匹配来删除整个“记录”标签。。。非常感谢你!

  • 我有一个XML文件: 我想使用XSLT将其转换为have: 我的文件: 但是我的输出文件中没有根节点。如何做到这一点? 还有,这是一个好的方法来进行转换吗?堆叠几个模板?

  • 您能帮助如何用子节点分割成半节点吗? 输入: 输出: 不幸的是,我对xslt没有经验,也没有找到这样的例子。 更新后,我尝试了下面建议的方法之一,并有这个https://xsltfiddle.liberty-development.net/jyH9rNq/3节点不复制 xslt: 输出:

  • 我想使用XSLT展平XML文件。示例(可以有任意数量的和节点): 输入: 期望输出: 如何仅展平那些将属性设置为的标记?

  • 我正在尝试处理这个XML文件,我想根据最新的节点值删除所有匹配的节点。在以下示例中,最新节点值为“${DELETE}”,最新节点值将始终为“${DELETE}”,并且该节点将始终位于XML文件的底部。 示例: 预期产出为:

  • 我想从XML结构中使用单个节点创建嵌套的XML节点,我尝试过但无法带来嵌套的XML结构,请一些人帮助我,我无法获得预期的行为。 XML结构: XSL使用: 收到的输出: 预期产出 “人员非活动”元素应用于匹配