Основное преимущество xsl: apply-templates перед for-each заключается в том, что код лучше адаптируется к изменяющимся структурам документа и требованиям обработки. Трудно продать эту выгоду людям, которые просто хотят взломать код и не заботятся о том, каким будет мир через три года, но это очень реальная выгода.

но я начал использовать XSLT для некоторых моих XML-документов, и у меня есть несколько вопросов. Я добавляю код ниже. В коде у меня есть шаблон, который соответствует элементам электронной книги. Затем я хочу перечислить всех авторов, которые написали книгу. Я делаю это, используя для каждого цикла, но я также могу применить шаблон к нему. Я не вижу четкой линии, когда использовать циклы и когда использовать шаблоны.

И другой вопрос - это нормально, когда вы просто говорите «apply-templates», когда у вас не будет других потомков элемента, где вы его пишете. В моем случае в шаблоне, который соответствует корню документа, я говорю apply-templates. Затем он находит электронные книги, которые являются его единственным потомком, но у меня может быть элемент «книги», который различает «обычные» книги и электронные книги, тогда он просто перечисляет данные о характере книг. Тогда мне нужно было бы написать apply-templates select = "ebooks", если бы я просто хотел, чтобы книги были в моем окончательном документе. Так это тот случай, когда это зависит от того, насколько хорошо вы знаете свой документ?

Спасибо, вот мой код (это только для практики):

XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ebooks.xsl"?>
<ebooks>
    <ebook>
        <title>Advanced Rails Recipes: 84 New Ways to Build Stunning Rails Apps</title>
        <authors>
            <author><name>Mike Clark</name></author>
        </authors>
        <pages>464</pages>
        <isbn>978-0-9787-3922-5</isbn>
        <programming_language>Ruby</programming_language>
        <date>
            <year>2008</year>
            <month>5</month>
            <day>1</day>
        </date>
        <publisher>The Pragmatic Programmers</publisher>
    </ebook>
    ...

XSLT:

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

    <xsl:template match="/">
        <html>
            <head>
                <title>Library</title>
            </head>
            <body>
                <xsl:apply-templates />            
            </body>
        </html>    
    </xsl:template>

    <xsl:template match="ebooks">
        <h1>Ebooks</h1>
        <xsl:apply-templates>
            <xsl:sort select="title"/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="ebook">
        <h3><xsl:value-of select="title"/></h3>
        <xsl:apply-templates select="date" />

        <xsl:for-each select="authors/author/name">
            <b><xsl:value-of select="."/>,</b>
        </xsl:for-each>
    </xsl:template>

    <xsl:template match="date">
        <table border="1">
            <tr>
                <th>Day</th>
                <th>Month</th>
                <th>Year</th>
            </tr>
            <tr>
                <td><xsl:value-of select="day"/></td>
                <td><xsl:value-of select="month"/></td>
                <td><xsl:value-of select="year"/></td>
            </tr>
        </table>
    </xsl:template>

</xsl:stylesheet>

Ответы на вопрос(4)

Ваш ответ на вопрос