2013-08-01 3 views
1

У меня есть 2 NodesРазличать существующего узла и пустого узла

<example/> и <example></example>.

Как я могу различать их?

На мой взгляд первый <xsl:when test="example">, а второй
<xsl:when test="example = ''">.

Я не думаю, что это правильно Я смущен этим. Кто-нибудь может прояснить?

Заранее спасибо

+0

Примечание: Тест = «пример» - это тест, если узел существует, он существует в обоих случаях и поэтому является истинным для обоих. Это относится также ко второму случаю, так как оба дочерних узла содержат пустую строку. –

ответ

0

На мой взгляд - обе формы пустого элемента равны, и это не представляется возможным, чтобы отличить их.

<xsl:when test="example"> проверяет, существует ли какой-либо элемент с именем «пример».

<xsl:when test="example = ''"> проверяет, является ли строковое значение элемента пустой строкой.

+0

Второе утверждение неверно, поскольку оно проверяет только, является ли строковое значение элемента пустой строкой. Он будет проверять true для '', но в этом случае элемент '' не пуст. Для тестирования дочернего элемента '' пустой используется 'test =" not (example/node()) "'. –

+0

Вы правы - моя вина. Я улучшил свой ответ. Спасибо за ваш комментарий. –

1

Информационный набор XML и состояние модели данных XPath, что нет никакой разницы между <example/> и <example></example>:

http://www.w3.org/TR/xml-infoset/#omitted (пункт D.7)

http://www.w3.org/TR/2007/REC-xpath-datamodel-20070123/#ElementNode (где вы не найдете никакой собственности отличающих две разные синтаксис для пустого элемента: если в элементе нет дочерних элементов с использованием синтаксиса, узел элемента построен таким же образом)

1

Как я могу различить их?

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

Например, если вы знаете, что в исходном файле нет экземпляров строки «/>», кроме как в теге пустой тега, вы можете сделать текстовую замену в исходном файле (обработанный как текст), чтобы изменить все экземпляры

/> 

в

_wasEmpty="yes"/> 

(в том числе ведущего пространства) перед разбором результат как XML, а затем ваш XSLT можно выделить с помощью <xsl:when test="example[_wasEmpty = 'yes']">.


я (и многие другие на SO) утверждают, что приложение, которое претендует на XML основе, но которые необходимо различать то, что XML говорит эквивалентны принципиально сломана - правильный подход здесь поговорить с тем, кто проектировал формат, который вы потребляете, и попросить их изменить его, чтобы отличать случаи по XML-совместимому способу, например, с использованием xsi:nil. Но я прагматичен и ценю, что иногда это невозможно ;-)

1

Они неотличимы по дизайну. Вы также можете написать

<example /> 

или

<example ></example > 

и те также будут неразличимы.

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

Смежные вопросы