XSLT命名空间版本

时间:2016-10-24 08:20:09

标签: xml xslt xml-namespaces

我正在使用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处理器

2 个答案:

答案 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')]"/>

(未经测试的代码)

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