【问题标题】:Complex xslt address splitting复杂的 xslt 地址拆分
【发布时间】:2012-08-15 21:20:54
【问题描述】:

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

代码需要这样处理:

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

我见过几个关于如何在给定字符串中给定某个字符或位置的情况下拆分字符串的问题,但从不使用这两个参数。我最初想扫描字符串并挑选出任何数字,但我认为这不适用于 P.O.箱号或编号的街道。

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

谢谢,

艾伦

【问题讨论】:

  • 您是否正在寻找通用地址解析解决方案,或者我们是否可以依赖诸如将door_num 与streed_name 和, 分隔开的第一个空格之类的东西将street_name 与addr_postfix 分开?
  • 地址和后缀并不总是用逗号隔开(我用一个逗号表示需要删除标点符号),但通常会有一个空格将 door_num 和 street_name 隔开

标签: xml xslt xpath split xslt-1.0


【解决方案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>

【讨论】:

  • 感谢您的快速回复,Dimitre。不幸的是,我忘记指定 addr_postfix 并不总是在逗号之后。有可能,地址后缀将用空格分隔。
  • @AllenMcDonald,这就是为什么我和 Mads 都说:“对于 this XML 文档”。您是否意识到您没有明确定义的问题?如果是这样,这根本不是问题——问题在于定义问题。
  • 我明白我没有明确定义的问题,但是我无法控制客户给我们的地址格式。有些包含逗号,有些则没有。我的任务是分离数据,我提供了信息来解决一个会改变的示例问题。如果我不够清楚,我深表歉意,但是如果我要定义每个场景,那就太复杂了。
  • @AllenMcDonald,这就是 Google 地图和 Bing 地图都无法成功解释每个用户输入地址的原因——也不是各种公共交通旅行计划者。你可以做的是定义你将要接受的输入语法并且不处理你不理解的输入。每当您有想要处理的明确定义的输入时,请然后提出问题。发布未定义的问题是不可取的——尝试解决它们几乎没有任何好处,因为总会有一些“新的、未指定的案例”。
  • 我一定会考虑到这一点。除了对 XSLT/XML 不熟悉之外,我还意识到这将是一项非常难以解决的任务,并且知道我自己无法解决它……这就是我在这里发布我的问题的原因。感谢您花时间帮助我,如果允许,我会投票支持您当前的解决方案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2017-10-06
    • 2020-02-20
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多