我有一个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,如果有帮助的话。
谢谢
答案 0 :(得分:1)
您可以使用//EstablishmentDetail[BusinessType = 'Retail' and 'London' = (AddressLine2, AddressLine3, AddressLine4)]
选择EstablishmentDetail
Retail
个BusinessType
元素,其中至少有一个列出的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;而业务类型是“零售业”。
如果您只想检查AddressLine2
至AddressLine4
,则只需将支票限制在这些字段中,例如:使用
//EstablishmentDetail[node()[(name() = 'AddressLine2' or name() = 'AddressLine3' or name() = 'AddressLine4') and starts-with(., 'London')] and BusinessType = 'Retail']
我不知道XPath 2.0是否会让生活更轻松。