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')]"/>
(未经测试的代码)
编辑 - 第一个代码行中缺少一个斜线
我正在使用 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')]"/>
(未经测试的代码)
编辑 - 第一个代码行中缺少一个斜线