在您的特定情况下,XML 文档不在默认命名空间中,因此 XPath 表达式如下:
/stock/item/name
不选择任何节点。
使用:
/*/*/*[name()='name' and @xml:format = 'long']/text()
或使用:
string(/*/*/*[name()='name' and @xml:format = 'long'])
第一个表达式选择所有元素的所有文本子节点,其名称为name
(无论名称空间如何)并且是 XML 文档中顶部元素的孙子节点。
第二个表达式生成 XML 文档中第一个元素的字符串值,使其名称为name
(无论名称空间如何),并且它是 XML 文档中顶部元素的孙子元素。
基于 XSLT 的验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:copy-of select="/*/*/*[name()='name' and @xml:format = 'long']/text()"/>
===========
<xsl:copy-of select="string(/*/*/*[name()='name' and @xml:format = 'long'])"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<stock xmlns="http://localhost/aaabbb">
<item item-id="1">
<name xml:format="short">This is a short name</name>
<name xml:format="long">This is a LONG name</name>
</item>
</stock>
计算两个 Xpath 表达式,并将选定元素(第一个)和生成的字符串结果(第二个)复制到输出:
This is a LONG name
===========
This is a LONG name