如何从 XSLT 中的地址字段中拆分街道和门牌号?
Posted
技术标签:
【中文标题】如何从 XSLT 中的地址字段中拆分街道和门牌号?【英文标题】:How can I split street and house number from address field in XSLT? 【发布时间】:2018-01-28 23:12:38 【问题描述】:如何通过 XSLT 街道和门牌号分开?我需要使用 XSLT 将地址字符串拆分为两个节点。所以,例如,
<Customer>
<ShippingAddress>Test Street 32a-33b</ShippingAddress>
...
</Customer>
应该如下变换:
<Customer>
<Street>Test Street</Street>
<HouseNo>32a-33b</HouseNo>
</Customer>
我认为正确的做法是从字符串的第一个数字开始拆分。有人出主意吗?
【问题讨论】:
你可以使用 XSLT 2.0 吗? 你能保证 ShippingAddress 的格式吗(即数字总是在最后并且没有空格)? 是的,我可以使用 xslt 2.0,并且门牌号码将始终位于最后,但可能有空格,例如'Elmstreet 34 - 36' 应该在 'Elmstreet' 和 '34 - 36' 中拆分 使用xsl:analyze-string
和正则表达式([^0-9]*)([0-9].*)
很容易,将这两个部分返回为regex-group(1)
和regex-group(2)
,但我很难想象它在任何情况下都能给出令人满意的结果真实数据。
请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
【参考方案1】:
这可能有点晚了,但我遇到了同样的问题。 经过一些调整,以下对我有用。
传入元素:
<AddressLine1>School straat 1</AddressLine1>
XSLT 2.0:
<Street>
<xsl:value-of select="substring(AddressLine1, 1, (string-length(AddressLine1)-(string-length(tokenize(AddressLine1,' ')[last()])+1)))"/>
</Street>
<StreetNumber>
<xsl:value-of select="tokenize(AddressLine1,' ')[last()]"/>
</StreetNumber>
输出:
<Street>School straat</Street>
<StreetNumber>1</StreetNumber>
【讨论】:
一个有效的解决方案是找到分割点ONCE,然后用它来提取前后部分。【参考方案2】:在 XSLT 2.0 中,您可以使用 analyze-string
来使用正则表达式来拆分字符串。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="ShippingAddress">
<xsl:analyze-string select="." regex="^(\D+)(\d.*)$">
<xsl:matching-substring>
<Street><xsl:value-of select="normalize-space(regex-group(1))" /></Street>
<HouseNo><xsl:value-of select="regex-group(2)" /></HouseNo>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
【讨论】:
干得好。非常感谢。现在我只有一个愚蠢的问题。我需要在另一个模板中调用 ''。我正在 XSLT 中迈出第一步:-D。 目前身份模板正在这样做。但是如果你真的想这样做,你可以做<xsl:apply-templates select="ShippingAddress" />
,假设你在一个匹配Customer
的模板中。
完美的蒂姆。太感谢了。有用。几秒钟后我会发布我的下一个问题,也许你会看看它:-D以上是关于如何从 XSLT 中的地址字段中拆分街道和门牌号?的主要内容,如果未能解决你的问题,请参考以下文章
java根据ip地址获取相应的所在地,精确到街道和门牌号,要怎么实现?