xslt apply-templates выбирает все оставшиеся текстовые узлы - PullRequest
0 голосов
/ 13 мая 2009

У меня есть этот упрощенный XML:

<?xml version="1.0" encoding="UTF-8"?>

<a>
    <b>
        <c>
            <d>1</d>
            <e>2</e>
        </c>
    </b>
    <f>
        <g>3</g>
    </f>
</a>

Это xslt, который я пытаюсь применить:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="a">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="b">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="c">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="d">

    </xsl:template>

</xsl:stylesheet>

Когда я применяю этот лист, я получаю выходные данные 2 3, которые являются оставшимися текстовыми узлами. Я читал о встроенных шаблонах, которые применяются, если он не может найти подходящий шаблон, но в этом случае он должен найти шаблон?

Что происходит?

Edit:

В этом случае я бы ничего не ожидал, потому что шаблоны пусты. Но я получил 2 3 вместо.

Ответы [ 2 ]

1 голос
/ 13 мая 2009

Когда вы делаете <xsl:template match="d">, вы указываете процессору игнорировать все узлы в <d>.

Все остальные узлы обрабатываются с правилами по умолчанию, включая text(), который предназначен для печати текста.

Вот почему вы видите 23, а не 1.

0 голосов
/ 13 мая 2009

Начните с корня:

<xsl:template match="/a">

И укажите либо режим (чтобы шаблон по умолчанию не вызывался, поскольку он не находит шаблон для e, f и g), либо определяете свой собственный * шаблон, который ничего не делает в конце таблицы стилей:

<xsl:template match="*"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...