XSLT: применить шаблон к узлам, которые не содержат определенного подузла - PullRequest
1 голос
/ 12 января 2011

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

<?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 ]

2 голосов
/ 12 января 2011

<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)]]">.

1 голос
/ 12 января 2011
<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>
...