Я попробовал ваши примеры кода с помощью Xmlstarlet, и он напечатал все имена элементов, даже те, которые имеют префикс media:
, так что, вероятно, вы или я используете программное обеспечение с ошибками. Во всяком случае, вот обходной путь.
Вы можете использовать тест узла в форме namespace-prefix:*
, чтобы выбрать все элементы в определенном пространстве имен, и символ канала |
, чтобы получить объединение путей выбора. Так что в этом случае для каждой строки
<xsl:for-each select="channel/item/* | channel/item/media:*">
должен делать то, что вы хотели. Обратите внимание, что префикс не обязательно должен совпадать с тем, который используется в документе XML, но он должен совпадать с префиксом, определенным в вашем документе XSLT.
Если бы проблема была противоположной, можно использовать выбор
channel/item/*[not(self::media:*)]
, чтобы исключить нежелательное пространство имен или использовать выделение
<xsl:for-each select="channel/item/*[namespace-uri(.)='']">
для выбора только элементов без определения пространства имен.