Как написать xslt, если элемент содержит буквы? - PullRequest
6 голосов
/ 05 декабря 2011

Sth должно быть всеми буквами или регулярными выражениями [A-Z]. Как совместить xslt с регулярными выражениями?

 <xsl:if test="string-contains(//ns0:elem/value, 'sth')">


        </xsl:if>

Ответы [ 3 ]

10 голосов
/ 05 декабря 2011

XPath / XSLT 1.0 не поддерживает регулярные выражения, но простая проверка может быть выполнена с использованием основных строковых функций.

Белый список

XPath 1.0 translateФункция может использоваться для имитации белого списка:

<xsl:variable name="alpha" 
              select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0">
    <!-- context node contains non-alpha characters -->
</xsl:if>

В тесте используется translate, чтобы сначала удалить все буквы в верхнем и нижнем регистре.Если длина результирующей строки не равна нулю, тогда исходная строка должна содержать дополнительные символы.

Обратите внимание, что приведенное выше выражение можно упростить до:

<xsl:if test="translate(., $alpha, '')">

... потому что любоенепустая строка оценивается как true.

Черный список

Используйте метод двойного перевода для обработки $alpha как черного списка:

<xsl:if test="translate(., translate(., $alpha, ''), '')">
    <!-- context-node contains characters on the blacklist (in $alpha) -->
</xsl:if>

Внутренний translate возвращает строку со всеми удаленными альфа-символами, которая затем используется в качестве шаблона для второго вызова translate, в результате чего получается строка, содержащая только альфа-символы.Если эта строка ненулевая, то мы нашли символ в черном списке.Это классический подход.См., Например, этот предыдущий вопрос по SO:

Тест черного списка также может быть выполнен следующим образом:

not(string-length(translate(., $alpha, ''))=string-length())

Если длина строки после удаления всех символов из черного списка не равна длине исходной строки, то строка должна содержать символ в черном списке.

Резюме

Черные и белые списки - это две стороны одной медали.Следующее демонстрирует их использование вместе:

<xsl:if test="translate(., $alpha, '')">
    [contains some characters not on the list]
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))">
    [contains only characters on the list]
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')">
    [contains some characters on the list]
</xsl:if>
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))">
    [contains only characters not on the list]
</xsl:if>
2 голосов
/ 05 декабря 2011

Как искать буквы в строке, если вы не можете использовать регулярные выражения в xslt?

Хороший вопрос, + 1.

Использовать :

translate(., translate(., $vAlpha, ''), '')

В этом случае все символы в строковом значении текущего узла получают в $vAlpha

Если вы хотите увидеть, содержит ли данная строка $str только буквы и никаких других символов, используйте :

string-length(translate($str, $vAlpha, '')) = 0

Полный пример кода:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:variable name="vUpper" select=
  "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

 <xsl:variable name="vLower" select=
  "'abcdefghijklmnopqrstuvwxyz'"/>

 <xsl:variable name="vAlpha" select=
      "concat($vUpper, $vLower)"/>

 <xsl:variable name="vStr" select="'A12B_..c02d'"/>

 <xsl:template match="/">
  <xsl:value-of select=
    "translate($vStr,
               translate($vStr, $vAlpha, ''), '')
    "/>


    The string <xsl:value-of select="$vStr"/> has <xsl:text/>
    <xsl:value-of select=
    "string-length(translate($vStr, $vAlpha, ''))"/> <xsl:text/>
    non-letters

 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к любому документу XML (не используется), получается требуемый, правильный результат :

ABcd


    The string A12B_..c02d has 7
    non-letters

Помните : первое приведенное выше выражение XPath демонстрирует так называемый " метод двойного перевода ", впервые предложенный @Michael Kay.

2 голосов
/ 05 декабря 2011

В XPath 1.0 (работает с XSLT 1.0) у вас нет инструмента для регулярных выражений (у вас просто есть такие функции, как contains или starts-with, для получения дополнительной информации см. Ссылку ниже)

В XPATH2.0 (работает с XSLT 2.0), у вас есть функция matches и функция replace (см. Ссылку ниже).

URL-адрес для просмотра:

Строковые функции XPath 1.0:http://www.w3.org/TR/xpath/#section-String-Functions

Функции регулярных выражений XPath 2.0: http://www.w3.org/TR/xpath-functions/#string.match

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...