我的代码如下:
<abc>
<aaa>123</aaa>
</abc>
<abc>
<aaa>123</aaa>
</abc>
当我将XPath表达式赋予:
//*[name() = 'aaa']
我得到输出为
{'123','123'}
我想要的只是从XPath表达式中获取一个结果,以便我可以将它与我给出的预期结果的属性进行比较。
答案 0 :(得分:2)
首先,您只需使用//aaa
,即可选择所有aaa
元素。如果您只想要第一个选定元素,请使用(//aaa)[1]
。
答案 1 :(得分:0)
您可能想看一下这个答案:
https://stackoverflow.com/a/4747858/36305
它演示了一种使用XSLT构建XPath表达式的方法,用于选择给定XML文档的每个节点,甚至生成用于比较值的XPath表达式:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vApos">'</xsl:variable>
<xsl:template match="*[@* or not(*)] ">
<xsl:if test="not(*)">
<xsl:apply-templates select="ancestor-or-self::*" mode="path"/>
<xsl:value-of select="concat('=',$vApos,.,$vApos)"/>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:apply-templates select="@*|*"/>
</xsl:template>
<xsl:template match="*" mode="path">
<xsl:value-of select="concat('/',name())"/>
<xsl:variable name="vnumPrecSiblings" select=
"count(preceding-sibling::*[name()=name(current())])"/>
<xsl:if test="$vnumPrecSiblings">
<xsl:value-of select="concat('[', $vnumPrecSiblings +1, ']')"/>
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<xsl:apply-templates select="../ancestor-or-self::*" mode="path"/>
<xsl:value-of select="concat('[@',name(), '=',$vApos,.,$vApos,']')"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
应用于提供的输入(包装在顶部元素中以形成格式良好):
<t>
<abc>
<aaa>123</aaa>
</abc>
<abc>
<aaa>123</aaa>
</abc>
</t>
结果是一组XPath表达式选择具有单个文本子元素的每个元素,并比较元素和子元素的字符串值:
/t/abc/aaa='123'
/t/abc[2]/aaa='123'
这也会生成表达式,包括属性值的比较,并且当属性值比较为true时,其布尔值恰好为true()
。
例如,如果提供的XML文档是:
<t>
<abc x="1" y="2">
<aaa>123</aaa>
</abc>
<abc z="3">
<aaa>123</aaa>
</abc>
</t>
然后转化的结果是:
/t/abc[@x='1']
/t/abc[@y='2']
/t/abc/aaa='123'
/t/abc[2][@z='3']
/t/abc[2]/aaa='123'