XSLT: удалить узлы с пустым определенным внуком

Я пытаюсь удалить некоторые узлы из XML с помощью XSLT.

Кусок трансформации выглядит так:

<xsl:template match="gmd:date[gmd:CI_Date/gmd:date/gco:DateTime = null]" />

... и XML выглядит так:

<gmd:MD_Metadata ... >
  ...
  <gmd:identificationInfo>
    <gmd:MD_DataIdentification>
      <gmd:citation>
        <gmd:CI_Citation>
          ...
          <gmd:date>
            <gmd:CI_Date>
              <gmd:date>
                <gco:DateTime />
              </gmd:date>
              ...
            </gmd:CI_Date>
          </gmd:date>
          ...
        </gmd:CI_Citation>
        ...
      </gmd:citation>
    </gmd:MD_DataIdentification>
  </gmd:identificationInfo>
</gmd:MD_Metadata>

Согласно тому, что я знаю о XSLT (хотя и немного), преобразование должно совпадать с пустым правнуком. Но это не так. Шаблон не соответствует и преобразование ничего не делает. Я пробовал разные вещи (сопоставьте его с 0, по умолчанию дата и время, сравните с текстом ()) ... ничего не работает.

Есть какие-нибудь подсказки?

1 ответ

Решение

Здесь нет null в XSLT.
Узел (текстовое значение является узлом) либо пуст, либо не существует.

Здесь пусто.
Поэтому вместо этого проверьте пустое значение:

<xsl:template match="gmd:date[gmd:CI_Date/gmd:date/gco:DateTime = '']" />

Теперь ваш gmd:date должно быть пропало, если gco:DateTime не имеет значения.

Другие вопросы по тегам