我有XML:
<?xml version="1.0"?>
<arquivoposicao_4_01 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<fundo xmlns="http://tempuri.org/">
我想获取节点<fundo>
的信息,但我有一些像上面那样的xml:<fundo xmlns="http://tempuri.org/">
如果存在这样的命名空间,我怎么能做<xsl:for-each select="fundo">
?
答案 0 :(得分:1)
您需要使用前缀声明命名空间,并使用它来限定属于该命名空间的元素的XPath选择器。您可以通过向xmlns
添加xsl:stylesheet
声明,并使用任何前缀:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="http://tempuri.org/"> <!-- add this declaration -->
现在,您选择fundo
使用您声明的前缀限定选择器。在此示例中,您将使用ns1:fundo
:
<xsl:for-each select="ns1:fundo">
...
答案 1 :(得分:1)
您有几个选择:
选项1
声明命名空间(将xmlns:t="http://tempuri.org/"
添加到xsl:stylesheet
)并在xpath中使用它(“t”前缀可以是任何内容):
<xsl:for-each select="t:fundo"></xsl:for-each>
选项2
在xpath中使用local-name()
:
<xsl:for-each select="*[local-name()='fundo']"></xsl:for-each>
您还可以使用namespace-uri()
确保准确选择所需内容:
<xsl:for-each select="*[local-name()='fundo' and namespace-uri()='http://tempuri.org/']"></xsl:for-each>
选项3 (仅限XSLT 2.0)
使用*
作为前缀:
<xsl:for-each select="*:fundo"></xsl:for-each>
这可以与选项2中的namespace-uri()
结合使用。
选项4 (仅限XSLT 2.0)
将xpath-default-namespace
属性添加到xsl:stylesheet
:
xpath-default-namespace="http://tempuri.org/"
答案 2 :(得分:1)
如果你有像这样的XML:
<fundo xmlns="http://tempuri.org/">
或
<t:fundo xmlns:t="http://tempuri.org/">
元素fundo
的名称可以像{http://tempuri.org/}:fundo
一样阅读。该元素位于特定名称空间中。所以忽略它不是一个好主意,它会改变语义。
Xpath也为名称空间使用别名。因此,您必须在XSL样式表元素上定义名称空间:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:temp="http://tempuri.org/">
该定义与源XML中的定义是分开的且独立的。您现在可以使用别名/前缀fundo
访问命名空间http://tempuri.org/
中的元素temp
。
<xsl:for-each select="temp:fundo">