2010-06-16 3 views
5

У меня есть XML, какСтрочные преобразования в XSL

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

+1

дубликата http://stackoverflow.com/questions/586231/how-can-i-convert -a-string-to-upper-or-lower-case-with-xslt –

ответ

10

Чтобы преобразовать строку в нижний регистре или верхнем регистр вы можете использовать функцию 1.0 XPath 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)"/> 
+0

Это не работает, если между строчными и прописными буквами нет однозначного соответствия. Немецкий ettsett (ß) является исключительно строчным, а версия в верхнем регистре - «SS». (Два буквы «S».) Учитывая количество букв в Юникоде и вероятность того, что даже некоторые сайты/службы, находящиеся в США, столкнутся с кем-то с акцентами в их именах, это нежизнеспособное решение, если вы не заботитесь об англиканских написаниях имен. – yam655

+0

@ yam655: Действительно, перевод одного символа на два символа не будет работать с использованием этого подхода. Параметр может состоять в том, чтобы добавить сопоставление в символ кода LATIN CAPITAL LETTER SHARP S Unicode (U + 1E9E), который был добавлен еще в 2008 году. Кстати, акцентированные символы будут работать, они просто должны быть в списке как Tomalak указал. Но в конце концов, XSLT/XPath 1.0 - очень ограниченная платформа, и я бы, конечно же, рекомендовал делать конверсии случаев с использованием специальной библиотеки с хорошей поддержкой I18N. –

+0

, который просто демонстрирует проблему с помощью метода translate(). Когда вы работаете с неанглийскими языками, вы начинаете иметь множественные сопоставления для вещей, которые лингвистически одинаковы. На немецком языке «ß» должен сравнивать то же, что и «ss», но люди могут это догадываться. Большие проблемы исходят из букв с акцентом, где у вас есть возможность непереступающих акцентов поверх базовой буквы по сравнению с одним кодовым номером. («Ê» против непереходного «^» и стандарта «E» и т. Д.) Я согласен, лучше использовать библиотеку с явной поддержкой I18N. IMO, translate() следует избегать. – yam655

4

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

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

Имейте в виду, хотя, например, с translate не будет работать на имена с акцентом (как у меня :)

+1

'translate()' работает с акцентированными символами. Они просто должны быть в списке. – Tomalak

+0

@Tomalak: Конечно, я имел в виду конкретный пример, который я связал. –

+0

и @Tomalak: Спасибо вам обоим за то, что помогли мне! – Bala

Смежные вопросы