Попробуйте поиграть с разными строками:
with example as (select 'BC:ZDEF' as x from dual
union select 'ABC:D' from dual
union select 'ABC:ZE' from dual
union select 'ZE' from dual
union select 'ZF' from dual)
select x
from example
where REGEXP_like(x, '^(ABC:)?Z[DEF]');
Вывод:
x
ABC:ZE
ZE
ZF
Так что же происходит? Вы правы относительно ^
, означающего начало строки. Оператор ?
означает the thing that comes before this is optional - it should occur 1 or 0 times
. В данном случае это (ABC:)
, поэтому часть строки является необязательной.
Тогда у нас есть Z
, которое является обязательным, за которым следует выражение в скобках, что означает любой отдельный символ, указанный в скобках - так что либо D, E, либо F.
Таким образом, выражение означает «строку, начинающуюся с Z, за которой следует D, E или F, необязательно с« ABC: »в начале».
test="categoryName != ''"
Редактировать : Это охватывает наиболее вероятную интерпретацию, по моему мнению, «[не] нулевого или пустого», как следует из вопроса, включая его псевдокод и мой ранний опыт работы с XSLT. То есть, «что эквивалентно следующей Java?»:
!(categoryName == null || categoryName.equals(""))
Для получения более подробной информации, например, для четкой идентификации пустого или пустого, см. ответ Джонви ниже и / или XSLT «скрипка» Я приспособился к этому ответу, который включает опцию в комментарии Майкла Кея, а также шестую возможную интерпретацию.
Из Пустой элемент :
Чтобы проверить, является ли значение определенного узла пустым
Это зависит от того, что вы подразумеваете под пустым.
not (node ())
not (string (.))
not (normalize-space ( .))
not (node () [not (self :: comment ())])
В отсутствие какой-либо другой информации я предполагаю следующий XML:
<group>
<item>
<id>item 1</id>
<CategoryName>blue</CategoryName>
</item>
<item>
<id>item 2</id>
<CategoryName></CategoryName>
</item>
<item>
<id>item 3</id>
</item>
...
</group>
Пример использования будет выглядеть следующим образом:
<xsl:for-each select="/group/item">
<xsl:if test="CategoryName">
<!-- will be instantiated for item #1 and item #2 -->
</xsl:if>
<xsl:if test="not(CategoryName)">
<!-- will be instantiated for item #3 -->
</xsl:if>
<xsl:if test="CategoryName != ''">
<!-- will be instantiated for item #1 -->
</xsl:if>
<xsl:if test="CategoryName = ''">
<!-- will be instantiated for item #2 -->
</xsl:if>
</xsl:for-each>