如何从预期结果中获取唯一值并将其与预期结果进行比较?

时间:2015-12-23 20:38:01

标签: xml xpath

我的代码如下:

<abc>
<aaa>123</aaa>
</abc>
<abc>
<aaa>123</aaa>
</abc>

当我将XPath表达式赋予:

//*[name() = 'aaa']

我得到输出为

{'123','123'}

我想要的只是从XPath表达式中获取一个结果,以便我可以将它与我给出的预期结果的属性进行比较。

2 个答案:

答案 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>&#xA;</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>&#xA;</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'