XPath Expression用于选择特定节点及其指定多个属性的属性

时间:2014-02-01 17:04:44

标签: xml xslt xpath xslt-1.0

我有一个配置文件,里面配置了多个事务插件。以下是交易插件的示例。事务插件的结构对于配置文件中可能存在的所有内容都是相同的。如何查询名为“mmc”的源并获取所有步骤。 “mmc”源也可以存在于另一种不同的事务配置中吗?

我写了

String expression = "/plugins/transaction[@code=501110]/source[@name=mmc]/step/@*";

但它没有给我任何结果

<transaction code="501110" name="A transaction" plugin="com.Transaction.ATransaction">
    <source name="mmc">
        <step id="0">
            <result code="*">
                <destination>mms</destination>
            </result>
        </step>
        <step id="1">
            <result code="0000">
                <destination>brmc</destination>
            </result>
            <result code="0012">
                <destination>cre</destination>
            </result>
            <result code="default">
                <destination>nc</destination>
            </result>
        </step>
    </source>
    <source name="mms">
        <step id="1">
            <result code="0000">
                <destination>bnk</destination>
            </result>
            <result code="default">
                <destination>nc</destination>
            </result>
        </step>
    </source>
    <source name="bnk">
        <step id="1">
            <result code="0000">
                <destination>nc</destination>
            </result>
            <result code="default">
                <destination>nc</destination>
            </result>
        </step>
    </source>
</transaction>

2 个答案:

答案 0 :(得分:2)

我没有在您的示例输入中看到plugins元素,但假设它在那里并且您只是没有显示它,那么沿着这些行的XPath应该这样做:

/plugins/transaction[@code = '501110']/source[@name = 'mmc']/step

这将选择指定路径下的所有step元素。

501110周围的引号在这种特殊情况下并不是绝对必要的,因为code是一个数字,但是如果它可能包含一个非数字字符,那么它是有意义的在此将其视为字符串值。

答案 1 :(得分:1)

尝试这样做:

/plugins/transaction[@code="501110"]/source[@name="mmc"]/step

如果您想要所有destination元素:

/plugins/transaction[@code="501110"]/source[@name="mmc"]/step/*[@name=contains(., "result code")]/destination/text()

如果您想要所有result code

/plugins/transaction[@code="501110"]/source[@name="mmc"]/step/*[@name=contains(., "result code")]/@code