XSLT 名称空间版本

XSLT namespace versions

我正在使用 XSLT 1.0。有没有办法处理输入文档命名空间版本?

比如我以前输入XML

<?xml version="1.0" encoding="UTF-8"?>
<abc:TheTag xmlns:abc="http://example.com/xmls/2014">
    <abc:hello>world</abc:hello>
</abc:TheTag>

使用 XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:abc="http://example.com/xmls/2014">
<xsl:template match="/">
    <xsl:value-of select="abc:TheTag/abc:hello"/>
</xsl:template>
</xsl:stylesheet>

现在输入更改为

<?xml version="1.0" encoding="UTF-8"?>
<abc:TheTag xmlns:abc="http://example.com/xmls/2016">
    <abc:hello>world</abc:hello>
</abc:TheTag>

即2014 至 2016

虽然我必须处理输入的两个版本 XML 并且我的样式 sheet 地址的部分对于 2014 年和 2016 年都是通用的,即它自己需要的样式 sheet没有变化。

那么,有没有一种方法可以使用一种样式 sheet 来处理两个版本的输入?

顺便说一句:XSLT 2.0 通过引入 *:TheTag/*:hello 使其变得更简单,但迁移到 2.0 版是我的最后选择,因为这意味着完全迁移到新的 XSLT 处理器

我会这样做:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns14="http://example.com/xmls/2014"
xmlns:ns16="http://example.com/xmls/2016">

<xsl:template match="/">
    <xsl:value-of select="ns14:TheTag/ns14:hello | ns16:TheTag/ns16:hello"/>
</xsl:template>

</xsl:stylesheet>

如果你想要它非常通用(复杂)并且确定不会发生冲突,你也可以使用

 <xsl:value-of select="*[local-name() = 'TheTag']/*[local-name() = 'hello']"/>

  <xsl:value-of select="*[local-name() = 'TheTag' and starts-with(namespace-uri(),
 'http://example.com/xmls/2')]/*[local-name() = 'hello' and 
  starts-with(namespace-uri(),'http://example.com/xmls/2')]"/>

(未经测试的代码)

编辑 - 第一个代码行中缺少一个斜线