Выражение XPath для выбора всех дочерних элементов, которые не являются определенным элементом - PullRequest
1 голос
/ 20 апреля 2011

Учитывая XML

<blockquote>
    <attribution>foo</attribution>
    <para>bar</para>
</blockquote>

У меня есть шаблон XSL

<xsl:template match="dbk:blockquote">
    <blockquote>
        <xsl:apply-templates select="*[not(dbk:attribution)]" />
        <xsl:apply-templates select="dbk:attribution" />
    </blockquote>
</xsl:template>

, где первый apply-templates должен выбрать все дочерние элементы dbk:blockquote, которые не относятся к типуdbk:attribution.(Это необходимо для перемещения атрибутов вниз.)

Однако на самом деле он соответствует каждому узлу.Почему?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2011

Вы хотите использовать ось self:

<xsl:apply-templates select="*[not(self::dbk:attribution)]" />

Выбирает дочерние элементы, которые сами не являются a dbk:attribution. Ваша версия выбирает дочерние элементы, которые не содержат a dbk:attribution child.

0 голосов
/ 20 апреля 2011

Я не эксперт по xpath.Но я думаю, что это должно работать.

<xsl:template match="dbk:blockquote">
    <blockquote>
        <xsl:apply-templates select="*[local-name(.) != 'attribution']" />
        <xsl:apply-templates select="*[local-name(.) = 'attribution']" />
    </blockquote>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...