如何从字符串中过滤状态缩写

时间:2011-02-21 21:25:28

标签: xml xslt xslt-2.0

我有XML,其中/ forms / form / @ number几乎可以是任何格式(字母,数字和单个空格的任意组合)。偶尔会有@number值,它们是相同的形式......但是是特定于州的。发生这种情况时,最后3个字符将是单个空格,后跟状态缩写。所以最后两个字符是州缩写...如果它存在的话。我需要能够选择这些“相同”的表格进行处理。

XSLT 2.0很好。我认为解决方案将涉及密钥或2.0分组方法,但我不知所措。注意:我仍然需要迭代在同一循环中没有状态特定匹配的表单...这只是我必须为多个状态的那些做一些特殊的事情。当然,我无法控制XML。

<forms>
<!-- THESE 3 WOULD MATCH -->
<form number="ABC 12 45"/>
<form number="ABC 12 45 IL"/>
<form number="ABC 12 45 KY"/>
<!-- 2 OF 3 WOULD MATCH AS ZZ IS NOT A STATE -->
<form number="CGF 45"/>
<form number="CGF 45 ZZ"/>
<form number="CGF 45 IL"/>
<!-- THESE 3 WOULD MATCH -->
<form number="955EZ IL"/>
<form number="955EZ MN"/>
<form number="955EZ CA"/>
<!-- NO MATCHES -->
<form number="25 AB 4"/>
<form number="SR HL DR"/>
</forms>

1 个答案:

答案 0 :(得分:1)

只需使用

<xsl:template match=
  "form[substring(@number, string-length(@number) -2, 1)=' '
      and
       translate(substring(@number, string-length(@number)-1),
                 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                ) = ''
      and
       contains('|AL|AK|AZ|AR|...|WA|WI|WY|',
                concat('|',substring(@number, string-length(@number)-1),'|')
                )
       =
        ''
       ]">

<!-- Needed processing here -->

</xsl:template>

XSLT 2.0解决方案

<xsl:template match=
  "form[substring(@number, string-length(@number) -2, 1)=' '
      and
       substring(@number, string-length(@number)-1)
      =
       ('AL','AK','AZ','AR',...,'WA','WI','WY') 
       ]">

<!-- Needed processing here -->

</xsl:template>