我正在尝试使用xslt进行一些转换,但是如果在XML文件中声明了命名空间,我将遇到一些问题:
示例:
<?xml version="1.0" encoding="UTF-8"?>
<rootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/ XSD.xsd"
xmlns="http://example.com/">
<elem1> TEST </elem1>
</rootNode>
在xsl样式表中,我有这样的代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:template match="/">
<TAG1> <xsl:value-of select="elem1"/> </TAG1>
</xsl:template>
</xsl:stylesheet>
问题是,如果我不删除XML中的命名空间viz: 的xmlns = “http://example.com/”
没有从XML文件中获取任何值。
我试着搜索很多帖子,但是我没有得到任何具体的线索,知道发生了什么。我认为,不管怎样,它可能与命名空间有关,我也尝试过,没有从XML中获取任何值。
非常感谢任何帮助。
答案 0 :(得分:1)
您需要做的就是在XSLT中声明命名空间。这样的东西会起作用(注意exclude-result-prefixes
,这会阻止新的命名空间绑定作为输出的一部分弹出):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ex="http://example.com/"
exclude-result-prefixes="ex">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:template match="/">
<TAG1> <xsl:value-of select="ex:elem1"/> </TAG1>
</xsl:template>
</xsl:stylesheet>
Remember that namespace prefixes are just placeholders for the actual namespace。因此,即使您在XSLT中将前缀绑定到命名空间,它也可能在其他XML文档中具有不同的前缀(或没有前缀),只要它绑定到相同的命名空间即可。
您的代码的另一个问题是您的主模板与根节点/
(位于根元素rootNode
之前)匹配。因此,除了修复命名空间之外,您还必须修复XPath:
<xsl:value-of select="ex:rootNode/ex:elem1"/>