Я использую XSLT 1.0
и используя xsltproc
на OS X Yosemite. Исходный контент - HTML; целевой контент - XML.XSLT: Как удалить ненужные узлы HTML из источника?
Вопрос довольно распространенный. Я хочу, чтобы все «неинтересные» узлы просто отбрасывались с выхода. Я видел уловы-все директивы, как это:
<xsl:template match="node()|script"/>
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
Это близко к тому, что мне нужно. Но, к сожалению, он слишком силен, когда мне нужно добавить еще один шаблон, который посещает один из текстовых узлов, пойманный node()
. Например, предположим, что я добавил этот шаблон:
<xsl:template match="a/div[@class='location']/br">
<xsl:text> </xsl:text>
</xsl:template>
, который просто заменяет определенные < бр/> элементы с пробелами. Ну, node()
исключает этот последний шаблон, вступающий в силу, , потому что соответствующий текстовый узел, содержащий разрыв строки, уже отбрасывается !
Ну, чтобы исправить эту проблему, вот что я сделал вместо этого захвата всех node()
:
<xsl:template match="html/head|div[@id='banner_parent']|button|ul|div[@id='feed_title']|span|div[@class='submit_event']|script"/>
Но это как раз проблема: я сейчас склеивание шаблона , чьи критерии соответствия вероятно, будет подвержен ошибкам при изменении содержимого источника .
Есть ли более простая директива, которая будет выполнять одно и то же? Я нацелен на что-то вроде этого:
<xsl:template match="node()[not(locations)]|script"/>
Спасибо.
Я не уверен, что понял ваш вопрос (небольшой пример ввода и ожидаемого результата будет очень полезно). Мне кажется, вы хотите узнать о приоритетах шаблонов: http://www.w3.org/TR/xslt/#conflict –
Определите «неинтересный». В этом случае определите «интересный». – EJP
Мне нужен шаблон, соответствующий/div [@ class = 'location'/br для работы; это интересный узел. Но шаблон catch-all, соответствующий 'node()', кажется, работает первым, то есть после его вступления в силу, шаблон a/div/br не имеет узлов для работы. –