Давайте рассмотрим интерфейс как указатель.
Скажем, у вас есть указатель a
, и он равен нулю, и ничего не указывает.
var a *int // nil
Тогда у вас есть указатель b
, и он указывает на a
.
var b **int
b = &a // not nil
Посмотрите, что произошло? b
указывает на указатель, который указывает на ничего. Так что даже если это указатель nil в конце цепочки, b
указывает на что-то - это не ноль.
Если вы заглянете в память процесса, это может выглядеть так: это:
address | name | value
1000000 | a | 0
2000000 | b | 1000000
Видите? a
указывает на адрес 0 (это означает, что он nil
), а b
указывает на адрес a
(1000000).
То же самое относится к интерфейсам (за исключением того, что они немного в памяти ).
Как и указатель, интерфейс, указывающий на указатель на nil, не будет нить.
Здесь см. себя , как это работает с указателями и , как это работает с интерфейсами .
Это может быть сделано, но только если возвращаемое значение, когда узел действительно существует, является строковым значением узла, не самого узла. XPath
substring(concat("N/A", /foo/baz), 4 * number(boolean(/foo/baz)))
возвратит строковое значение baz
элемент, если это существует, иначе строка "N/A".
Обобщать подход:
substring(concat($null-value, $node),
(string-length($null-value) + 1) * number(boolean($node)))
где $null-value
строка нулевого значения и $node
выражение для выбора узла. Отметьте это если $node
оценивает к набору узлов, который содержит больше чем один узел, строковое значение первого узла используется.
Для пустых узлов Вам нужно
boolean(string-length($node))
(Можно опустить вызов к number()
поскольку бросок от булевской переменной до числа неявен здесь.)
Это может быть сделано с XPath 1.0. Скажите, что Вы имеете
<foo>
<bar/>
</foo>
Если Вы хотите протестировать если foo
имеет a baz
ребенок,
substring("N/A", 4 * number(boolean(/foo/baz)))
возвратит "N/A" если выражение /foo/baz
возвращает пустой набор узлов, иначе он возвращает пустую строку.
Короткий ответ: нет. Такую функцию рассмотрели и явно отклонили для версии 2 спецификации XPath (см. ненормативный Иллюстративный Написанный пользователем раздел Functions).
@jelovirt
Таким образом, если я понимаю это правильно, мы связываем ответ по умолчанию и значение узла, и затем берем корректное подмножество получившей строки путем тестирования на существование узла для установки смещения для или обнуления или положение прямо после моей строки по умолчанию. Это - самое извращенное скручивание языка, который я когда-либо видел. (Я люблю его!)
Разъяснить то, что Вы сказали, этот подход работы, когда узел отсутствует, не, когда узел пуст. Но путем замены "числа (булевская переменная ($node))" с "длиной строки ($node)" это будет работать над пустыми узлами вместо этого.