2015-08-18 2 views
1

Я использую 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"/> 

Спасибо.

+0

Я не уверен, что понял ваш вопрос (небольшой пример ввода и ожидаемого результата будет очень полезно). Мне кажется, вы хотите узнать о приоритетах шаблонов: http://www.w3.org/TR/xslt/#conflict –

+0

Определите «неинтересный». В этом случае определите «интересный». – EJP

+0

Мне нужен шаблон, соответствующий/div [@ class = 'location'/br для работы; это интересный узел. Но шаблон catch-all, соответствующий 'node()', кажется, работает первым, то есть после его вступления в силу, шаблон a/div/br не имеет узлов для работы. –

ответ

0

Если я правильно понял, вы хотите получить только некоторые узлы на выходе, а остальное вам не нравится, в этом примере я пытаюсь поймать только элементы li и отбросить остальных. Не уверен, что это то, что вы хотите хотя http://xsltransform.net/gWmuiKk

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
<!-- Lets pretend li is interesting for you --> 
<xsl:template match="li"> 
<xsl:text>Interesting Node Only! 
</xsl:text> 
</xsl:template> 

<xsl:template match="@*|node()"> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:template> 
</xsl:transform> 
Смежные вопросы