2017-10-11 85 views
0

我有一个简单的问题,在我的XML文件中,我有我的祖先节点上的参数,当我尝试迭代,然后从我的xslt文件,它不起作用。XSLT为每个迭代(与祖先属性的问题)

作为例子,我的XML文件:

<?xml version="1.0" encoding="utf-8"?> 
    <nfeProc versao="3.10" xmlns="http://www.portalfiscal.inf.br/nfe"> 
     <NFe xmlns="http://www.portalfiscal.inf.br/nfe"> 
      <infNFe Id="NFe99999" versao="3.10"> 
       <ide> 
        <cUF>35</cUF> 
        ... 
       </ide> 
       <emit> 
        <CNPJ>01881662000180</CNPJ> 
        ... 
       </emit> 
       </infNFe> 
      </NFe> 
    </NFeProc> 

我的XSLT文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <h2>My CNPJs/h2> 
    <table border="1"> 
     <tr bgcolor="#9acd32"> 
     <th>Number</th> 
     </tr> 
     <xsl:for-each select="nfeProc/NFe/infNFe/emit"> 
     <tr> 
     <td><xsl:value-of select="./CNPJ" /></td> 
     </tr> 
     </xsl:for-each> 
    </table> 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

当我运行这个例子,我没有得到任何结果。

在我的测试中,我发现问题(我猜)与祖先标签内的参数有关。如果我删除属性的xmlns标记,来自nfeProc和非正规教育的标签,我得到的结果如预期(我CNPJ值)

xmlns="http:/www.portalfiscal.inf.br/nfe" 

有人知道如何处理这个问题?问题是什么,以及如何解决?

因为我无法更改XML结构,因为它来自政府。

编辑

作为回答了同伴,这些问题是关系到命名空间。我会继续搜索,并已做了一些修改,把命名空间在我的XSLT文件如下:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http:/www.portalfiscal.inf.br/nfe"> 

,并改变了我的每一个到:

<xsl:for-each select="t:nfeProc/t:NFe/infNFe/emit"> 

,但继续不工作,我没有按不会返回任何错误,但不起作用。

在此先感谢。

+0

的默认命名经典问题。搜索术语并尝试解决方案。 – Parfait

+0

你是对的,因为我没有方向,我不知道什么搜索。我在想,xmlns只是标签中的简单参数。我会看看。 –

+0

您错过了命名空间中的'/'。它应该是'http:// www.portalfiscal.inf.br/nfe'而不是'http:/ www.portalfiscal.inf.br/nfe'。另外,你需要在xpath't:nfeProc/t:NFe/t:infNFe/t:emit'中的所有元素前面使用't:'前缀,因为默认命名空间是继承的(即,需要在XML中的所有元素上使用'xmlns =“...”',除非儿童名称空间不同) –

回答

1

您无法删除全部xmlns-namespace是的。

或者你可以用它在XPath所有herited节点:

t:nfeProc/t:NFe/t:infNFe/t:emit 

该宣言:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.portalfiscal.inf.br/nfe"> 
+0

谢谢!但它似乎不适合我。搜索我现在知道你的答案对我发布的内容有意义!谢谢,我会继续努力。 –

+0

确定编辑并检查我的答案后解决;)thks – GGO

+0

我所错过的是,xPath中的每个元素都需要t:前缀,正如@Tim C在上面注释中提到的那样。谢谢,现在正在工作。:) –