Как проверить, есть ли в xml textnode китайские символы с RegEx в XSLT - PullRequest
4 голосов
/ 07 июля 2011

На этом веб-сайте http://gskinner.com/RegExr/ (который является тестовым веб-сайтом RegEx) это соответствие регулярному выражению работает Совпадение: [^\x00-\xff]
Образец текста: test123 或元件数据不可用

Но если у меня есть этот вводXML:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <node>test123 或元件数据不可用</node>
</root>

, и я пробую эту таблицу стилей XSLT 2.0 с Saxon 9:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root/node">
    <xsl:if test="matches(., '[^\x00-\xff]')">
      <xsl:text>Text has chinese characters!</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Saxon 9 выдает следующую ошибку:

    FORX0002: Error at character 3 in regular expression "[^\x00-\xff]": invalid escape sequence
  Failed to compile stylesheet. 1 error detected.

Какпроверить наличие китайских символов в XSLT 2.0?

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

С помощью Майкла Кея я могу ответить на свой вопрос сам.Спасибо, Майкл!Решение работает, но, на мой взгляд, эти длинные диапазоны Unicode выглядят не очень красиво.

Этот XSLT напечатает текстовое сообщение, если какой-либо китайский символ будет найден с регулярными выражениями в данном XML:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root/node">
    <xsl:if test="matches(.,'[&#x4E00;-&#x9FFF;&#x3400;-&#x4DFF;&#x20000;-&#x2A6DF;&#xF900;-&#xFAFF;&#x2F800;-&#x2FA1F;]')">
      <xsl:text>Text has chinese characters!</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Решение с указанным блоком Unicode:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root/node">
    <xsl:if test="matches(., '[\p{IsCJKUnifiedIdeographs}\p{IsCJKUnifiedIdeographsExtensionA}\p{IsCJKUnifiedIdeographsExtensionB}\p{IsCJKCompatibilityIdeographs}\p{IsCJKCompatibilityIdeographsSupplement}]')">
      <xsl:text>Text has chinese characters!</xsl:text>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>
3 голосов
/ 07 июля 2011

Диалект регулярных выражений, поддерживаемый XPath, основан на том, что определено в XSD: вы можете найти полные спецификации в документах W3C или, если вы предпочитаете что-то более читабельное, в Справочнике моего программиста XSLT 2.0. Не думайте, что все диалекты регулярных выражений одинаковы. В XPath regexen нет выхода \x, потому что он предназначен для встраивания в XML, который уже предлагает &#xHHHH;.

Вместо использования шестнадцатеричного диапазона может оказаться более удобным использовать именованный блок Unicode, например \p{IsCJKUnifiedIdeographs}.

См. Также Каков полный диапазон китайских символов в Юникоде?

...