我尝试为以下格式的输入xml创建XSL转换。
同时使用<xsl:for-each />
和<xsl:template />
XML 1:
<books>
<book>
<title>charithram</title>
<author>sarika</author>
</book>
<book>
<title>doublebell</title>
<author>psudarsanan</author>
</book>
</books>
XSLT 1:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Author</th>
</tr>
<xsl:for-each select="books/book">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="author" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
或者
XSLT 2:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Author</th>
</tr>
<xsl:apply-templates/>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="books/book">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="author" /></td>
</tr>
</xsl:template>
</xsl:stylesheet
...
现在,如果XML是
XML 2:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book.child.1>
<title>charithram</title>
<author>sarika</author>
</book.child.1>
<book.child.2>
<title>doublebell</title>
<author>psudarsanan</author>
</book.child.2>
</books>
我可以使用books/child::*
XSLT 3:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr>
<th>Title</th>
<th>Author</th>
</tr>
<xsl:for-each select="books/child::*">
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="author" /></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
问题:
在上述方案中使用<xsl:for-each/>
和应用模板有什么区别?我没有看到任何区别。 [ XSLT 1和XSLT 2 ]
请验证这是否正确。 [使用<xsl:for-each select="books/child::*">
完成结果] [ XSLT 3 ]
更新: 我已经删除了我的第三个问题,并将在另一个帖子中发布。
答案 0 :(得分:1)
1)事实上,你是对的。 xsl:for-each
是一种“匿名内联模板”。在许多情况下,它实际上是不好的做法,因为它往往表明样式表是在程序上而不是由规则驱动的......但它有时是表达逻辑的最佳方式。与大多数编程语言一样,解决大多数问题的方法不止一种,程序员需要培养一种风格来挑选最好的问题。
2)正如Ian Roberts所说,“是的,那会有效,但书籍/孩子:: *可以缩短为书籍/ *,因为孩子::是默认轴”。 (他确实值得回答那个问题 - 我半睡半醒而且没有获得Round Tuit。)