Как сделать так, чтобы пустые узлы в xml не отображались?

После преобразования по определенному шаблону иногда появляются узлы с пустыми записями. Надо чтобы они не отображались.
Вероятно както через проверку text(). Что-то не получается.
Кто-нибудь сталкивался с такой задачкой?
  • Вопрос задан
  • 6196 просмотров
Пригласить эксперта
Ответы на вопрос 5
@MikhailEdoshin
Если узлы выбираются XPath'ом, можно применять шаблон только к узлам с текстом

/path/to/node[text()]

или, если у него есть подэлементы, и берется все значение

/path/to/node[string(.)]

или, если шаблон применяется в ходе обхода дерева, а не через select или for-each, то можно, соответственно, в паттерне указать:

<xsl:template match="node[text()]">
   ...
</xsl:template>

или, если вы создаете новые узлы, и далее apply-templates, а потом оказывается, что ничего не вышло и элемент в результате пустой, то можно сначала apply-templates внутри переменной, а затем проверить, получилось ли что-нибудь:

<xsl:variable name="contents">
  <xsl:apply-templates />
</xsl:variable>
<xsl:if test="string($contents)">
  <MyElement>
    <xsl:copy-of select="$contents" />
  </MyElement>
</xsl:variable>
Ответ написан
yadeveloper
@yadeveloper
Зависит от структуры вашего дерева и шаблона.

Вообще вот, почитайте — soa-howto.blogspot.com/2009/09/how-to-remove-empty-nodes-from-xml.html
Ответ написан
seriyPS
@seriyPS
Можно создать «удаляющий шаблон» для любого тега у которого нет содержимого. Будет выглядеть как-то так:

<xsl:template match="*[not text() and not self::*]"></xsl:template>

Сразу скажу — не проверял. Возможно нужно будет ему приоритет выставить повыше т.к. у шаблонов со * приоритет низкий.
Ответ написан
patashnik
@patashnik
Так?

/root/node/child[text()]
Ответ написан
darzet
@darzet Автор вопроса
Спасибо большое всем.
Мне придется весь код видимо переписать.
Я сделал все без темплейтов=(
Это каждый нод придется обрабатывать копипастом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы