XML元素具有名称空间,我的XPATH不起作用

我得到了以下XML:

<root>

<items>

<item>

<title>Item</title>

<details>

<data xmlns="http://some_url">

<length>10</length>

<weight>1.2</weight>

</data>

</details>

</item>

</items>

</root>

跟随XPath不起作用意味着没有任何打印内容,例如“ data”元素不存在:

/root/items/item/details/data

但是,当我删除“数据”元素的“ xmlns”名称空间属性时,将打印其内容。在不删除“数据”元素的“ xmlns”命名空间属性的情况下,xpath表达式应该如何工作?

我正在使用SAXON和XSL 1.0。

回答:

这是XPath / XSLT中最常见的问题之一:

XPath会将不带前缀的元素名称解释为属于“无名称空间”,这就是为什么在XPath表达式中仅将不带前缀名称的元素指定为节点测试时,未选择具有默认(非空)名称空间的元素的原因。

解决方案是:

创建一个名称空间绑定,在该绑定中,前缀(例如”x”)与默认名称空间相关联,然后指定x:elementName而不是elementName。

使用长而丑陋且不可靠的表达式,例如: *[name() = ‘elementName’]

这是使用上述方法的XSLT转换1。:

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:a="http://some_url">

<xsl:output method="text"/>

<xsl:template match="/">

<xsl:value-of select=

"/root/items/item/details/a:data/a:weight"/>

</xsl:template>

</xsl:stylesheet>

在提供的XML文档上应用此转换(使用Saxon 6.5.4或任何其他兼容的XSLT 1.0处理器)时:

<root>

<items>

<item>

<title>Item</title>

<details>

<data xmlns="http://some_url">

<length>10</length>

<weight>1.2</weight>

</data>

</details>

</item>

</items>

</root>

选择了正确/需要的节点,并将其字符串值复制到输出:

1.2

以上是 XML元素具有名称空间,我的XPATH不起作用 的全部内容, 来源链接: utcz.com/qa/411146.html

回到顶部