Основное преимущество 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>