2011-01-12 6 views
1

Я использую docbook, и я использую шаблон, который вставляет символы нулевой ширины в мои записи в таблице. Это хорошо, но мне нужно иметь шаблон NOT, если запись в таблице содержит элемент <para>. Итак, есть ли способ применить шаблон ко всем <entry>, которые не содержат <para>?XSLT: применить шаблон к узлам, которые не содержат определенного поднабора

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:d="http://docbook.org/ns/docbook"> 
<xsl:import href="urn:docbkx:stylesheet"/> 

... 

<xsl:template match="text()[parent::d:entry]"> 
    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str" select="."/> 
    </xsl:call-template> 
</xsl:template> 

... 

ответ

2

<xsl:template match="d:entry[not(d:para)]"> соответствует любым entry элементы, не имеющие каких-либо para детей. <xsl:template match="d:entry[not(descendant::d:para)]"> соответствует любым entry элементам, не имеющим para потомкам.

Или для вашего размещенного шаблона вы можете использовать <xsl:template match="text()[parent::d:entry[not(d:para)]]">.

+0

Это право. Но последнее sugestion с фоном и обратной осью ... Почему бы не 'd: entry [not (d: para)]/text()' вместо этого? –

+0

Алехандро, вы правы, используя 'd: entry [not (d: para)]/text()' более прямолинейно, чем 'text() [parent :: d: entry [not (d: para)] ] 'и я, вероятно, напишу так, когда начну самостоятельно. Но я начал с 'text() [parent :: d: entry]' в исходном посте и адаптировал это, поэтому я оказался наоборот. Ace, если вы все еще читаете, подумайте о том, чтобы использовать 'match =" d: entry [not (d: para)]/text() "' вместо 'match =" text() [parent :: d: entry [not (d: пункт)]] "'. –

1
<xsl:template match="text()[parent::d:entry[not(.//d:para)]]"> 
    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str" select="."/> 
    </xsl:call-template> 
</xsl:template>