XSLT为每个迭代(与祖先属性的问题)
我有一个简单的问题,在我的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">
,但继续不工作,我没有按不会返回任何错误,但不起作用。
在此先感谢。
您无法删除全部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">
谢谢!但它似乎不适合我。搜索我现在知道你的答案对我发布的内容有意义!谢谢,我会继续努力。 –
确定编辑并检查我的答案后解决;)thks – GGO
我所错过的是,xPath中的每个元素都需要t:前缀,正如@Tim C在上面注释中提到的那样。谢谢,现在正在工作。:) –
的默认命名经典问题。搜索术语并尝试解决方案。 – Parfait
你是对的,因为我没有方向,我不知道什么搜索。我在想,xmlns只是标签中的简单参数。我会看看。 –
您错过了命名空间中的'/'。它应该是'http:// www.portalfiscal.inf.br/nfe'而不是'http:/ www.portalfiscal.inf.br/nfe'。另外,你需要在xpath't:nfeProc/t:NFe/t:infNFe/t:emit'中的所有元素前面使用't:'前缀,因为默认命名空间是继承的(即,需要在XML中的所有元素上使用'xmlns =“...”',除非儿童名称空间不同) –