XSLT Шаблоны и применение шаблонов - PullRequest
2 голосов
/ 13 октября 2011

Я очень плохо знаком с XSLT, и мне трудно понять некоторые из его концепций.

У меня есть следующий XML-файл:

 <?xml version="1.0" encoding="ISO-8859-1"?>
 <?xml-stylesheet type="text/xsl" href="test.xsl"?>

<Page>
    <Page>
        <Page />
    </Page>
    <Page>
        <Page />
    </Page>
    <Page />
    <Page />
    <Page />
</Page>

И когда применяется следующий XSL-файл (test.xsl):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
 <html>
    <head>
    </head>
    <body>
        <h2>
            <xsl:apply-templates name="PageCount" />
        </h2>
    </body>
 </html>
 </xsl:template>

 <xsl:template match="Page" name="PageCount">
     Page <xsl:value-of select="position()" />
     of <xsl:value-of select="count(/Page/Page)" />

 </xsl:template>
</xsl:stylesheet>

Я получаю вывод:

Страница 2 из 5

Однако, если я изменю «apply-templates» на «call-template», он изменит вывод на:

Страница 1 из 5

Почему это происходит?

Также, если я добавлю другой шаблон:

  <xsl:template match="Page" name="PageCount2">
    Page <xsl:value-of select="position()" />
    of <xsl:value-of select="count(/Page)" />
  </xsl:template>

и использование «apply-templates», похоже, дает мне вывод:

Страница 2 из 1

Это сбивает с толку меня. Что происходит?

Заранее спасибо.

1 Ответ

2 голосов
/ 13 октября 2011

Когда вы используете <xsl:apply-templates/>, оно действительно короткое для <xsl:apply-templates select="node()"/> и вызывается внутри совпадения шаблона на /, который является корневым узлом документа и абстрактной концепцией для верхней части файла. , Это дочерние элементы, включающие элемент документа (т.е. <Page>), а также любые комментарии верхнего уровня или инструкции по обработке, которые могут быть родственными элементами элемента документа.

Таким образом, когда вы «стоите» на корневом узле, вызов <xsl:apply-templates/> будет применять шаблоны к /Page, что соответствует определенному вами шаблону. position() оценивается из сопоставленный контекст, который равен /Page и возвращает 2, потому что это второй элемент в документе. Первый элемент - это инструкция по обработке таблицы стилей xml. Если вы удалите его, то position() будет равно 1.

Когда вы используете <xsl:call-template name="PageCount"/>, он вызывает тот же шаблон, но контекст не изменяется при вызове шаблона. Вы все еще «стоите» на корневом узле, поэтому position() оценивает до 1.

count() всегда оценивает одно и то же, независимо от контекста, потому что он использует XPath, который запускается в корневом узле. Если бы вы изменили его на count(Page/Page) и оценили относительное значение из узла контекста, вы бы получили разные значения (2 и 5 соответственно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...