如何在XPath中有条件地选择节点

时间:2014-02-14 17:59:07

标签: java xml xpath xsd

我正在使用的XSD架构,需要国际或国内地址:

"/mns:PhysicalAddress/mns:DomesticAddress/mns:City"

"/mns:PhysicalAddress/mns:InternationalAddress/mns:City"

它被用作Java方法中的参数,如XMLUtils.BuildField(Document doc, String xpath)

我知道我可以直接使用创建doc的Java对象并使用自动生成的bean来查询元素,但我更喜欢保留在XPath的简洁领域内。这可能吗?

如果是这样,我如何编写XPath表达式选择mns:City,无论它是国际地址还是国内地址?

注意:这在 Java 中,而不是Javascript,HTML或XSLT,所以我认为<xsl:if>与此无关。

2 个答案:

答案 0 :(得分:2)

您可以找到所有拥有父母之一的城市:

//mns:City[(parent::mns:DomesticAddress|parent::mns:InternationalAddress)]

如果您还需要确保地址在物理地址中:

//mns:City[(parent::mns:DomesticAddress|parent::mns:InternationalAddress)[parent::mns:PhysicalAddress]]

或者,不是反转层次结构,而是执行*并检查名称:

/mns:PhysicalAddress/*[name()="mns:DomesticAddress" or name()="mns:InternationalAddress"]/mns:City

答案 1 :(得分:2)

取决于XML的精确结构,

/mns:PhysicalAddress/*/mns:City

可能就足够了,如果拉得太多,那么最明智的选择可能就是使用你已经拥有的两个替代方案,用|分隔:

/mns:PhysicalAddress/mns:DomesticAddress/mns:City | /mns:PhysicalAddress/mns:InternationalAddress/mns:City

或稍微简洁但(在我看来)不太清楚:

/mns:PhysicalAddress/*[self::mns:DomesticAddress | self::mns:InternationalAddress]/mns:City