XSL / XPath - 搜索不同命名的元素(通配符?)

时间:2016-11-04 15:00:19

标签: xml xslt xpath wildcard

我有一个XML格式的地址列表,有多个'EstablishmentDetails'使用XSL我希望将它转换为geojson文件。

 <EstablishmentCollection>
    <EstablishmentDetail>
        <BusinessName>Company Name</BusinessName>
        <BusinessType>Retail</BusinessType>
        <AddressLine1>14 Somerset Place</AddressLine1>
        <AddressLine2>London</AddressLine2>
        <AddressLine3>...</AddressLine3>
        <AddressLine4>...</AddressLine4>
        <PostCode>SW11 1AP</PostCode>
    </EstablishmentDetail>
</EstablishmentCollection>

我希望在伦敦恢复所有商业类型'零售'的出现。如果伦敦在'AddressLine2',它可以使用这一行:

<xsl:apply-templates select="//EstablishmentDetail[BusinessType = 'Retail' and AddressLine2 = 'London']">

但是,根据地址的格式,伦敦可以出现在AddressLine2,3或4中(但绝不会出现在多行中)。 如何搜索这三个节点?是否可以使用通配符?在Stackoverflow搜索后,我发现了:

*[starts-with(name(), 'London')]

但我不确定如何将其与上述工作线结合起来。

我正在使用Saxon,XPath 2,如果有帮助的话。

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用//EstablishmentDetail[BusinessType = 'Retail' and 'London' = (AddressLine2, AddressLine3, AddressLine4)]选择EstablishmentDetail RetailBusinessType元素,其中至少有一个列出的AddressLineX元素为London }。

作为替代方案,您可以使用//EstablishmentDetail[BusinessType = 'Retail' and *[matches(local-name(), 'AddressLine[234]')] = 'London']

答案 1 :(得分:0)

以下XPath 1.0表达式:

//EstablishmentDetail[node()[starts-with(name(), 'AddressLine') and starts-with(., 'London')] and BusinessType = 'Retail']

将选择所有节点EstablishmentDetail,其中任何地址行都以&#39;伦敦&#39;而业务类型是“零售业”。

如果您只想检查AddressLine2AddressLine4,则只需将支票限制在这些字段中,例如:使用

//EstablishmentDetail[node()[(name() = 'AddressLine2' or name() = 'AddressLine3' or name() = 'AddressLine4') and starts-with(., 'London')] and BusinessType = 'Retail']

我不知道XPath 2.0是否会让生活更轻松。