Объединяяа также - PullRequest
       2

Объединяяа также

2 голосов
/ 01 августа 2010

Я пытаюсь сделать сайт более динамичным, разделив его на части. У меня был файл XML для первой страницы, который теперь был преобразован в 4 файла: index.xml, menu.xml, sidebar.xml и footer.xml.

(обновлено)

Я правильно включил XML в файл index.xsl. Теперь мне нужно включить .xls, который они будут использовать. На самом деле все это находится в одном файле и работает нормально, так что XML include решены.

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="menu" select="document('../menu.xml')"/>
    <xsl:param name="sidebar" select="document('../sidebar.xml')"/>
    <xsl:param name="footer" select="document('../footer.xml')"/>

    <xsl:template match="/">
        <!-- Split header.xsl -->
        <html lang="es">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title><xsl:value-of select="page/title" /></title>

                <link rel="stylesheet" type="text/css" href="css/main.css" /> 
                <script type="text/javascript" src="js/custom.js"></script> 
            </head>

            <body>
                <div class="content">
                    <div class="header">
                        <div id="tabs" class="menu">
                            <ul>
                                <xsl:for-each select="$menu/menu/category">
                                    <li><a><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="name"/></a></li>
                                </xsl:for-each>
                            </ul>
                        </div>
                    </div>                   

                    <div class="body">

                    <!-- End Split header.xsl -->

                        <div class="body_izqda">
                            <xsl:for-each select="page/news/contents/entry">
                                <h2><xsl:value-of select="title" /></h2>
                                <p><xsl:value-of select="text" /></p>
                            </xsl:for-each>
                        </div>

                        <!-- Split sidebar.xml -->
                        <div class="body_dcha">
                            <ul>
                                <xsl:for-each select="$sidebar/sidebar/results/category">
                                    <li>
                                        <a><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="name" /></a>
                                    </li>
                                </xsl:for-each>
                            </ul>
                        </div>
                        <!-- End Split sidebar.xml -->

                        <!-- Split footer.xml -->
                        <div class="clear">
                        </div>
                    </div>

                    <div class="footer">
                        <ul>
                            <xsl:for-each select="$footer/footer/entry">
                                <li><a><xsl:attribute name="href"><xsl:value-of select="link" /></xsl:attribute><xsl:value-of select="title" /></a></li>
                            </xsl:for-each>
                        </ul>
                    </div>
                </div>
            </body>
        </html>
        <!-- End Split footer.xml -->
    </xsl:template>
</xsl:stylesheet>

Кстати, я хочу разделить эти части XLST с файлами XLS. Я пытался с <xsl:include>, но я не могу заставить его работать с меню $ param.

Я маркировал Разделить и Завершить разделение , где мне нужно разделить документ

Я уже пытался решить с первым ответом @svick, но разделив его на отметки, которые я сделал, класс XSLTPRocessor для PHP дает мне:

Предупреждение: XSLTProcessor :: importStylesheet () [xsltprocessor.importstylesheet]: импорт элемента разрешен только как дочерний элемент таблицы стилей

Итак, что-то не так с разделением по способу, которым я занимаюсь, и затем включением.

Как я могу это решить?

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

NOTE1 head.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>

            <title><xsl:value-of select="page/title" /></title>

            <link rel="stylesheet" type="text/css" href="css/reset-min.css" />
            <link rel="stylesheet" type="text/css" href="css/main.css" />
            <link rel="stylesheet" type="text/css" href="css/jquery-ui.css" />
        </head>
    </xsl:template>
</xsl:stylesheet>

Ответы [ 3 ]

3 голосов
/ 01 августа 2010

Объединение <xsl:import> и <xsl:param>, кажется, работает нормально для меня:

main.xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:param name="title" select="'Page title'" />
  <xsl:include href="head.xsl"/>
</xsl:stylesheet>

head.xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="head">
    <title>
      <xsl:value-of select="$title"/>
    </title>
  </xsl:template>
</xsl:stylesheet>

Применение файла main.xsl к файлу, содержащему <head />, дает <title>Page title</title>, как и ожидалось.Если это вам не поможет, вы должны опубликовать некоторый код, где вы на самом деле используете <xsl:import> и <xsl:param> (и это не работает).

1 голос
/ 02 августа 2010

Итак, что-то не так с разделением, как я делаю, и затем включением.Как я могу это решить?

Да, что-то не так.Вы хотите разделить шаблон brick ...

Сначала вам нужно кое-что разделить, поэтому эта таблица стилей:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dummy="dummy"
exclude-result-prefixes="dummy">
    <xsl:param name="menu" select="document('menu.xml')"/>
    <xsl:param name="sidebar" select="document('sidebar.xml')"/>
    <xsl:param name="footer" select="document('footer.xml')"/>
    <dummy:attSet>
        <footer class="footer"/>
        <menu class="menu" id="tabs"/>
        <sidebar class="body_dcha"/>
    </dummy:attSet>
    <xsl:template match="/page">
        <html lang="es">
            <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
                <title>
                    <xsl:value-of select="title" />
                </title>
                <link rel="stylesheet" type="text/css" href="css/main.css" />
                <script type="text/javascript" src="js/custom.js"></script>
            </head>
            <body>
                <div class="content">
                    <div class="header">
                        <xsl:apply-templates select="$menu"/>
                    </div>
                    <div class="body">
                        <xsl:apply-templates select="news/contents"/>
                        <xsl:apply-templates select="$sidebar"/>
                        <div class="clear"></div>
                    </div>
                    <xsl:apply-templates select="$footer"/>
                </div>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="page/news/contents">
        <div class="body_izqda">
            <xsl:apply-templates/>
        </div>
    </xsl:template>
    <xsl:template match="contents/entry/title">
        <h2>
            <xsl:value-of select="."/>
        </h2>
    </xsl:template>
    <xsl:template match="contents/entry/text">
        <p>
            <xsl:value-of select="."/>
        </p>
    </xsl:template>
    <xsl:template match="menu/category|sidebar/results/category|footer/entry">
        <li>
            <a href="{link}">
                <xsl:value-of select="name"/>
            </a>
        </li>
    </xsl:template>
    <xsl:template match="/footer|/menu|/sidebar">
        <div>
            <xsl:copy-of select="document('')/*/dummy:*/*[name()=name(current())]/@*"/>
            <ul>
                <xsl:apply-templates/>
            </ul>
        </div>
    </xsl:template>
</xsl:stylesheet>

С этим вводом:

<page>
    <title>Some Page</title>
    <news>
        <contents>
            <entry>
                <title>Title1</title>
                <text>Text1</text>
            </entry>
            <entry>
                <title>Title2</title>
                <text>Text2</text>
            </entry>
            <entry>
                <title>Title3</title>
                <text>Text3</text>
            </entry>
            <entry>
                <title>Title4</title>
                <text>Text4</text>
            </entry>
        </contents>
    </news>
</page>

А это документы:

menu.xml

<menu>
    <category>
        <link>http://www.example.com/link1</link>
        <name>Link1</name>
    </category>
    <category>
        <link>http://www.example.com/link2</link>
        <name>Link2</name>
    </category>
    <category>
        <link>http://www.example.com/link3</link>
        <name>Link3</name>
    </category>
</menu>

sidebar.xml

<sidebar>
    <results>
        <category>
            <link>http://www.example.com/link4</link>
            <name>Link4</name>
        </category>
        <category>
            <link>http://www.example.com/link5</link>
            <name>Link5</name>
        </category>
        <category>
            <link>http://www.example.com/link6</link>
            <name>Link6</name>
        </category>
    </results>
</sidebar>

и footer.xml

<footer>
    <entry>
        <link>http://www.example.com/link7</link>
        <name>Link7</name>
    </entry>
    <entry>
        <link>http://www.example.com/link8</link>
        <name>Link8</name>
    </entry>
    <entry>
        <link>http://www.example.com/link9</link>
        <name>Link9</name>
    </entry>
</footer>

Выведите тот же результат, который предоставил таблицу стилей.

Итак, теперь вы можете разделить таблицу стилей на несколько модулей.

0 голосов
/ 02 августа 2010

Понятно. Проблема заключается в том, что каждый файл <xsl:include> d должен быть действительным XSLT, что означает, что он должен быть действительным XML. И вы не можете иметь незамкнутые теги в допустимом XML, но вам нужен, например, незамкнутый <html> в head.xsl. Поэтому я не думаю, что вы можете сделать это в XSLT.

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