0

我有一个需要在第一个空格之后拆分的地址(我认为可以安全地假设街道名称在第一个空格之后开始)。然后我需要将每个文本部分(街道名称/门号/邮政信箱)分配给不同的节点。所有标点符号也需要删除。

代码需要这样做:

<address>123 1st St., P.O. Box 321</address>

并把它变成这样:

<door_num>123</door_num>
<street_name>1st St</street_name>
<addr_postfix>PO Box 321</addr_postfix>

我已经看到了几个关于如何在给定字符串中给定字符或位置的情况下拆分字符串的问题,但从不使用这两个参数。我最初想扫描字符串并挑选出任何数字,但我认为这不适用于邮政信箱号码或编号的街道。

我在想我需要使用 substring-before 和 substring-after 运算符,但我不知道如何正确实现它们。另外,这很复杂,我什至不知道从哪里开始

谢谢,

艾伦

4

2 回答 2

1

下面是一个完整的转换,适用于所提供的 XML 文档:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="address">
   <xsl:variable name="vNum" select="substring-before(.,' ')"/>
   <xsl:variable name="vStreet" select=
    "substring-before(substring-after(.,$vNum), ',')"/>
   <xsl:variable name="vPOBox" select="substring-after(.,',')"/>

   <door_num><xsl:value-of select="$vNum"/></door_num>
   <street_name>
    <xsl:value-of select="normalize-space(translate($vStreet, '.',''))"/>
   </street_name>
   <addr_postfix>
    <xsl:value-of select="normalize-space(translate($vPOBox, '.',''))"/>
   </addr_postfix>
 </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<address>123 1st St., P.O. Box 321</address>

产生了想要的正确结果:

<door_num>123</door_num>
<street_name>1st St</street_name>
<addr_postfix>PO Box 321</addr_postfix>
于 2012-08-16T02:18:08.863 回答
0

这解决了示例地址的特定情况,可以帮助您入门:

<xsl:template match="address">
    <door_num>
       <xsl:value-of select="substring-before(., ' ')"/>
    </door_num>
    <street_name>
       <xsl:value-of select="translate(substring-before(substring-after(., ' '), ','), '.', '')"/>
    </street_name>
    <addr_postfix>
       <xsl:value-of select="translate(normalize-space(substring-after(., ',')), '.', '')"/>
     </addr_postfix>
</xsl:template>
于 2012-08-16T01:11:04.587 回答