XSL применяет более одного шаблона - PullRequest
2 голосов
/ 16 ноября 2011

Я преобразую XML-документ с помощью PHP / XSL.Я ищу значение ключевого слова.Я хочу добавить пейджинг, поэтому я не возвращаю все результаты поиска.Я могу сделать это с отдельными файлами xsl, но я бы хотел присоединиться к ним, если смогу.Как я могу вернуть результаты поиска и затем применить пейджинг?Например,

Пейджинг

...
<xsl:if test="position() &gt; $start and position() &lt; $end">
...

Search.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/*">
<items>
<xsl:attribute name="count"><xsl:value-of select="count(//item)"/></xsl:attribute>
<xsl:apply-templates select="//item">
    <xsl:sort select="*[name()=$sortBy]" order="{$order}" data-type="{$type}" />
</xsl:apply-templates>
</items>
</xsl:template>

<xsl:template match="//item">
    <xsl:choose>
        <xsl:when test="contains(
                 translate(title, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                    'abcdefghijklmnopqrstuvwxyz'), $keyword) 
                    or contains(translate(content, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                    'abcdefghijklmnopqrstuvwxyz'), $keyword)">
            <item>
                <title><xsl:value-of select="title"/></title>
                <content><xsl:value-of select="content"/></content>
                <date><xsl:value-of select="date"/></date>
                <author><xsl:value-of select="author"/></author>
                <uri><xsl:value-of select="uri"/></uri>
                <division><xsl:value-of select="division"/></division>
            </item>
        </xsl:when>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

Окончательное решение с использованием переменной xslи node-set ()

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
<xsl:output omit-xml-declaration="yes" method="xml" version="1.0" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="searchResults">
    <xsl:apply-templates select="//item">
        <xsl:sort select="*[name()=$sortBy]" order="{$order}" data-type="{$type}" />
    </xsl:apply-templates>
</xsl:variable>

<xsl:template match="//item">
    <xsl:choose>
        <xsl:when test="contains(translate(title, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), $keyword) or contains(translate(content, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), $keyword)">
            <item>
                <title><xsl:value-of select="title"/></title>
                <content><xsl:value-of select="content"/></content>
                <date><xsl:value-of select="date"/></date>
                <author><xsl:value-of select="author"/></author>
                <uri><xsl:value-of select="uri"/></uri>
                <division><xsl:value-of select="division"/></division>
            </item>
        </xsl:when>
    </xsl:choose>
</xsl:template>

<xsl:template match="//item" mode="paging">
    <xsl:choose>
        <xsl:when test="position() &gt; $start and position() &lt; $end">
            <item>
                <title><xsl:value-of select="title"/></title>
                <content><xsl:value-of select="content"/></content>
                <date><xsl:value-of select="date"/></date>
                <author><xsl:value-of select="author"/></author>
                <uri><xsl:value-of select="uri"/></uri>
                <division><xsl:value-of select="division"/></division>
            </item>
        </xsl:when>
    </xsl:choose>
</xsl:template>

<xsl:template match="/*">
    <items>
        <xsl:attribute name="count"><xsl:value-of select="count(//item)"/></xsl:attribute>
        <xsl:apply-templates select="exslt:node-set($searchResults)/*" mode="paging" />
    </items>
</xsl:template>

Ответы [ 3 ]

0 голосов
/ 16 ноября 2011

Я думаю, что это не способы последовательно применять разные шаблоны в одном преобразовании.Итак, попробуйте добавить подкачку xpath для поиска xpath:

<xsl:when test="contains(
             translate(title, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                'abcdefghijklmnopqrstuvwxyz'), $keyword) 
                or contains(translate(content, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                'abcdefghijklmnopqrstuvwxyz'), $keyword)
                and
                position() &gt; $start and position() &lt; $end">
0 голосов
/ 16 ноября 2011

Мне кажется, что вам следует разделить преобразование на две фазы: одну для поиска и одну для подкачки страниц.

Вы можете написать конвейер, который выполняет два преобразования, написанные в виде отдельных таблиц стилейили (с небольшой помощью exslt:node-set()) вы можете сделать это в одной таблице стилей, сохранив результаты во временной переменной.Я бы порекомендовал две таблицы стилей - это делает код более читабельным и многократно используемым.

0 голосов
/ 16 ноября 2011

Читать о режимах в XSLT .

Затем используйте в этих двух случаях:

<xsl:apply-templates mode="search" select="someExpression">
 <!-- <xsl:with-param> children if necessary -->
 <!-- <xsl:sort> children if necessary -->
</xsl:apply-templates>

, а также:

<xsl:apply-templates mode="paging" select="someExpression">
 <!-- <xsl:with-param> children if necessary -->
 <!-- <xsl:sort> children if necessary -->
</xsl:apply-templates>

Конечно, у вас должны быть темпалы в каждом из вышеперечисленных режимов.

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