我正在使用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的两个版本,而我的样式表地址的部分在2014年和2016年都是通用的,即它自己不需要更改的样式表。
那么,有没有办法使用一个样式表来处理两个版本的输入?
BTW:XSLT 2.0通过引入*:TheTag / *:hello使其变得更简单,但迁移到2.0版本是我的最后一个选择,因为它意味着完全转移到新的XSLT处理器答案 0 :(得分:0)
我会这样做:
<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>
答案 1 :(得分:0)
如果你想要它真的通用(复杂)并且确保没有发生冲突,你也可以使用
<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')]"/>
(未经测试的代码)
编辑 - 第一个代码行中缺少斜线