У меня есть 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.
Чтобы преобразовать строку в нижний или верхний регистр, вы можете использовать функцию 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)"/>
emp[lower-case(fname)=lower-case($srchStr)]
Или, если у вас только XPath 1.0, вы можете попробовать использовать translate, как здесь: http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx
Однако будьте внимательны, пример с translate
не будет работать с именами с ударениями (как у меня :)