复杂的xslt地址拆分

时间:2012-08-15 21:20:54

标签: xml xslt xpath split xslt-1.0

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

代码需要这样:

<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运算符,但我不知道如何正确实现它们。此外,这非常复杂,我甚至不知道从哪里开始

谢谢,

阿伦

2 个答案:

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

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