如何用xmlns治疗结节?

时间:2014-06-27 17:56:43

标签: xml xslt namespaces xml-namespaces

我有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">

3 个答案:

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