如何在XSLT中从地址字段中拆分街道和门牌号码?

时间:2017-08-20 23:17:23

标签: xml xslt

如何通过XSLT街道和门牌号码分开?我需要使用XSLT将地址字符串拆分为两个节点。所以,例如,

<Customer> 
   <ShippingAddress>Test Street 32a-33b</ShippingAddress> 
...
</Customer>

应该看起来像下面的转变:

<Customer> 
<Street>Test Street</Street> 
<HouseNo>32a-33b</HouseNo> 
</Customer>

我认为正确的方法是从字符串中的第一个数字开始分割。有人有想法吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

在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>