Преобразование в нижний регистр в XSL

У меня есть XML как

<emps>
<emp id='3432'>
 <fname>Jack</fname>
 <lname>Dawson</lname>
<emp>
<emp id='1122'>
 <fname>Jack</fname>
 <lname>Thompson</lname>
<emp>
<emps>

Я разрабатываю веб-приложение, которое выполняет поиск в этом xml-файле на основе введенного имени и отображает результирующую страницу. Для этого я написал xslt для преобразования XML в HTML на основе входной строки поиска, которая передается как переменная с именем srchStr.

<xsl:template match="employees">
  <xsl:for-each select="emp[fname=$srchStr]">
<tr>
   <xsl:variable name="id">
    <xsl:value-of select="@id" />
   </xsl:variable>
   <td>
    <a href='detailSearch.do?id={$id}'>
     <xsl:value-of select="fname" />
     ,
     <xsl:value-of select="lname" />
    </a>
   </td>

  </tr>
</xsl:for-each
</xsl:template>

Но пользователь может ввести имя как в верхнем, так и в нижнем регистре. Итак, как преобразовать имя внутри тега xml fname в нижний регистр и провести сравнение?

Может ли кто-нибудь поместить фрагмент кода для использования fn:lower-case внутри моего xsl.


person Bala    schedule 16.06.2010    source источник
comment
Дубликат stackoverflow.com/questions/586231/   -  person Lukas Eder    schedule 25.02.2011


Ответы (2)


Чтобы преобразовать строку в нижний или верхний регистр, вы можете использовать функцию XPath 1.0 translate:

Сначала определите свои алфавиты для букв нижнего и верхнего регистра. Обратите внимание, что положение каждой пары символов должно быть одинаковым:

<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>
<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>

Затем вы можете преобразовать в верхний регистр:

<xsl:value-of select="translate($toconvert,$lcletters,$ucletters)"/>

или в нижнем регистре

<xsl:value-of select="translate($toconvert,$ucletters,$lcletters)"/>
person Dirk Vollmar    schedule 16.06.2010
comment
Это не работает, если нет однозначного соответствия между строчными и прописными буквами. Немецкое ettsett (ß) имеет исключительно нижний регистр, а версия верхнего регистра - SS. (Две буквы "S".) Учитывая количество букв Unicode и вероятность того, что даже сайты / службы только для США встретят кого-то с диакритическими знаками в своих именах, это нежизнеспособное решение, если только вы не заботитесь исключительно об англиканском написании имен. . - person yam655; 27.01.2014
comment
@ yam655: Действительно, при таком подходе невозможно преобразовать один символ в два символа. В качестве варианта можно добавить сопоставление с символом кода Юникода LATIN CAPITAL LETTER SHARP S (U + 1E9E), который был добавлен еще в 2008 году. Между прочим, символы с диакритическими знаками будут работать, они просто должны быть в списке как Tomalak указал. Но в конце концов, XSLT / XPath 1.0 - это очень ограниченная платформа, и я бы определенно рекомендовал выполнять преобразование регистров с использованием специальной библиотеки с хорошей поддержкой I18N. - person Dirk Vollmar; 27.01.2014
comment
это просто демонстрирует проблему с подходом translate (). Когда вы имеете дело с неанглийскими языками, у вас появляется множество сопоставлений для вещей, которые лингвистически идентичны. В немецком языке ß следует сравнивать с ss, но люди могут догадаться об этом. Более серьезные проблемы возникают из-за букв с диакритическими знаками, когда у вас есть возможность установить не продвигающийся акцент поверх базовой буквы по сравнению с одной кодовой точкой. ('Ê' против не продвигающегося '^' и стандартного 'E' и т. Д.) Я согласен, лучше использовать библиотеку с явной поддержкой I18N. ИМО, translate () следует избегать. - person yam655; 27.01.2014

emp[lower-case(fname)=lower-case($srchStr)]

Или, если у вас только XPath 1.0, вы можете попробовать использовать перевод, как здесь: http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx

Однако будьте осторожны, пример с translate не будет работать с именами с диакритическими знаками (например, мой :)

person František Žiačik    schedule 16.06.2010
comment
translate() работает с акцентированными символами. Они просто должны быть в списке. - person Tomalak; 16.06.2010
comment
и @Tomalak: Спасибо вам обоим за то, что помогли мне! - person Bala; 17.06.2010