我在这里搜索了互联网/帖子,试图找到我问题的答案。我正在学习XML并且有一项任务我必须将以前的.xml转换为.xslt。我已经得到了所有这些,但是一小部分代码无法找到我输入的值。 例如;我知道可能有很多其他方法可以实现这一点,但这是我给出的代码。
.xml的一部分如下:
<collection>
<movie>
<title>Braveheart</title>
<genre v_genre="Action"/>
<rating v_rating="R"/>
<grading v_grading="4"/>
<summary>William Wallace, a commoner, unites the 13th Century Scots in their battle to overthrow Englands rule </summary>
<year>1995</year>
<director>Mel Gibson</director>
<runtime>177</runtime>
<studio>Icon Entertainment International</studio>
<actors>
<actor ID="001">Mel Gibson</actor>
<actor ID="002">Sophie Marceau</actor>
<actor ID="003">Patrick McGoohan</actor>
</actors>
</movie>
现在为此,我不明白这个价值。 如果有人可以帮助我理解那部分我会非常感激。问题的第2部分将是.xslt doc正确填充,除了以下部分:流派,评级和评分。我尝试了多种不同的方法来尝试获取填充值。这是代码的一部分。
<xslt:for-each select="collection/movie">
<tr>
<td>
<xslt:value-of select="title"/>
</td>
<td>
<xslt:value-of select="genre"/>
</td>
<td>
<xslt:value-of select="rating/v_rating"/>
</td>
<td>
<xslt:value-of select="grading/v_grading"/>
</td>
<td>
<xslt:value-of select="summary"/>
</td>
<td>
<xslt:value-of select="year"/>
</td>
<td>
<xslt:value-of select="director"/>
</td>
<td>
<xslt:value-of select="runtime"/>
</td>
<td>
<xslt:value-of select="studio"/>
</td>
<td>
<xslt:value-of select="actors"/>
</td>
</tr>
</xslt:for-each>
</table>
</body>
</html>
</xslt:template>
</xslt:stylesheet>
我试图真正理解为什么这种方式是为了将来的用途。整个大学的事情。希望这不会被删除。我已经搜索了很多地方来解决这个问题,但没有例子以这种方式列出来。先谢谢你。
答案 0 :(得分:2)
您遇到问题的元素是这些
<genre v_genre="Action"/>
<rating v_rating="R"/>
<grading v_grading="4"/>
因此,如果您注意到,您想要的值保存在属性中,而不是子文本节点中。因此,您需要将 xsl:value-of 更改为此(在流派
的示例中)<xsl:value-of select="genre/@v_genre"/>
如果您热衷于学习XSLT,可能值得知道, xsl:apply-templates 优先于 xsl:for-each 。此外,您应该在代码中删除repitition。查看示例,表单元格的输出顺序与XML中的子元素的顺序相同。因此,您可以创建一个通用模板来匹配大多数子元素以输出表格单元格。
试试这个XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/collection">
<table>
<xsl:apply-templates select="movie"/>
</table>
</xsl:template>
<xsl:template match="movie">
<tr>
<xsl:apply-templates/>
</tr>
</xsl:template>
<xsl:template match="genre">
<td>
<xsl:value-of select="@v_genre"/>
</td>
</xsl:template>
<xsl:template match="rating">
<td>
<xsl:value-of select="@v_rating"/>
</td>
</xsl:template>
<xsl:template match="grading">
<td>
<xsl:value-of select="@v_grading"/>
</td>
</xsl:template>
<xsl:template match="*">
<td>
<xsl:value-of select="."/>
</td>
</xsl:template>
</xsl:stylesheet>
请注意,XSLT处理器将匹配更具体的命名元素(例如流派),然后在最后匹配*
的通用模板。