我获得了以下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
但是当我删除“data”元素的“xmlns”命名空间属性时,它的内容被打印出来。 如何在不删除“data”元素的“xmlns”命名空间属性的情况下,xpath表达式应该如何工作?
我正在使用SAXON和XSL 1.0。
答案 0 :(得分:15)
这是XPath / XSLT中最常见的一个:
XPath将未加前缀的元素名称解释为属于“无命名空间”,这就是当只有未加前缀的名称被指定为节点测试时,未选择属于默认(非空)命名空间的带有无前缀名称的元素的原因。一个XPath表达式。
解决方案是:
创建名称空间绑定,其中前缀(例如"x"
)与默认名称空间相关联,然后指定x:elementName
而不是elementName
。
使用长而丑陋且不可靠的表达方式,例如:*[name() = 'elementName']
以下是使用上述方法1进行的XSLT转换。 :
<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
答案 1 :(得分:0)
在XPath中,您必须为命名空间分配前缀。如何执行此操作取决于您使用的XPath软件/库,但假设您将名称空间URI http://some_url
与名称空间前缀someUrl
相关联,则可以按如下方式更改XPath表达式:
/root/items/item/details/someUrl:data