当xml具有与元素

时间:2015-10-18 10:03:13

标签: xml xslt xslt-1.0

我正在尝试使用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中获取任何值。

非常感谢任何帮助。

1 个答案:

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