Недавно я начал использовать XSLT для некоторых моих XML-документов, и у меня есть некоторые вопросы. Я добавляю код ниже. В коде у меня есть шаблон, который соответствует элементам ebook. Затем я хочу перечислить всех авторов, написавших книгу. Я делаю это, используя для каждого цикла, но я также могу применить к нему шаблон. Я не вижу четкой строки, когда нужно использовать циклы и когда использовать шаблоны.
И еще один вопрос: нормально ли просто утверждать шаблоны, когда вы сейчас, что не будут другие дети того элемента, где вы его пишете. В моем случае в шаблоне, который соответствует корню документа, я говорю 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>