Как отфильтровать сокращения состояний из строк - PullRequest
3 голосов
/ 22 февраля 2011

У меня есть XML, где число / forms / form / @ может быть практически в любом формате (любая комбинация букв, цифр и пробелов).Иногда встречаются значения @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 Ответ

1 голос
/ 22 февраля 2011

Просто используйте :

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