XSLT 转换在我删除根节点之前不起作用
Posted
技术标签:
【中文标题】XSLT 转换在我删除根节点之前不起作用【英文标题】:XSLT Transform doesn't work until I remove root node 【发布时间】:2021-09-06 22:02:23 【问题描述】:我正在尝试使用 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 提供的网络服务,他们就是这样呈现的。
有什么想法吗?
【问题讨论】:
这是另一种拥有默认命名空间的情况。在本网站搜索示例 具体来说,搜索“XSLT 默认命名空间”会将您带到其他 506 个提出相同问题的人。 【参考方案1】:问题:您的 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>
【讨论】:
后续问题。我需要从响应中删除 html 标签,因为我不处理 web。当我删除 , 时,我得到的响应是 Frosty start。晴天或晴天。 我需要这个没有 标签的响应。为什么我会得到这个以及如何删除它?感谢您的帮助。 @hazymat 您能否编辑您的问题并发布您想要获得的确切结果(作为代码)? 请忽略我的最后一条评论,我忘记了我需要包含另一行来正确编码我正在使用的系统的输出。所以它按预期工作。再次感谢您的帮助。 @michael.hor257k thx ,即使我也面临同样的问题,并且根据您的建议,它有效。 感谢这也帮助解决了我的问题。需要强调的是,这只适用于默认命名空间“xmlns=...”。如果源 xml 文件中有任何其他合格的命名空间,则必须将它们添加到“xsl:stylesheet”中,在 xpath 中使用(没有默认命名空间的临时前缀),并添加到“exclude-result-prefixes”(作为空格分隔的列表)。【参考方案2】:除了“michael.hor257k”的答案之外,还有另一种解决方案,适用于 XSLT 2.0 版。
XSLT 2.0
使用xpath-default-namespace
属性。对于上面的示例,它看起来像这样:
<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"/>
【讨论】:
以上是关于XSLT 转换在我删除根节点之前不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 msxsl 中将节点作为参数传递:来自 XSLT for-each 的脚本 javascript 函数不起作用