我尝试使用XSLT设置XML文件的样式。我是一个BASH shell脚本,它使用WGET命令每5秒从VLC Media Player下载一份XML文件。下面是XML文件的示例部分,其中包含我希望使用XSLT设置样式的信息。请注意,在示例XML中,有许多标签以< info name =' unique >>开头。并以< / info>结尾。例如,第一个标签是< info name =' date'> 1991< / info>第三个标记是< info name =' filename'> Something in the Way< / info>。
<category name="meta">
<info name='date'>1991</info>
<info name='artwork_url'>file://D:/Music/Nirvana/Nevermind/Folder.jpg</info>
<info name='filename'>Something in the Way</info> </category>
我在XML文件的头部使用此代码来设置XML样式。
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
当我在浏览器中显示.xml文件时,它通过XSLT设置样式。但是,只有第一个&lt; info&gt;标签显示。在此示例中,仅&lt; info name =&#39; date&#39;&gt; 1991&lt; / info&gt;会显示。我的总体目标是在浏览器中仅显示带名和歌曲名称。
我实际上拥有一个非常不寻常的解决方案,即在Linux中使用 SED 或 AWK 命令以及某种类型的auto_increment选项,查找和替换文本信息,以便将XML转换为类似下面的内容。然后我可以设置XSLT来读取info1,info2,info3等等。
<info1>data</info1>
<info2>data</info2>
<info3>data</info3>
很难完成这种不寻常的解决方法,因为VLC输出动态信息标签,因此一个XML文件可能具有&lt; info name =&#39; date&#39;&gt;标记,下一个XML文件可能不包含&lt; info name =&#39; date&#39;&gt;标签,所以我不能使用期望$ 27的AWK命令始终是&lt; info name =&#39; date&#39;&gt;。这似乎也不是这个问题的推荐解决方案,可能是一种易变的方法,这就是我在这里发布问题以获得反馈的原因。
我也对XML命名空间进行了一些研究,但我不确定我是否应该专注于命名空间。任何见解,提示或建议都将非常感激。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
</tr>
<xsl:for-each select="category">
<tr>
<td><xsl:value-of select="info"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
在XSLT 1.0中,xsl:value-of
获取所选节点集的第一个节点的值。如果你想获得所有这些,请使用以下内容:
<xsl:for-each select="category">
<tr>
<xsl:for-each select="info">
<td><xsl:value-of select="."/></td>
</xsl:for-each>
</tr>
</xsl:for-each>
或者,您可以按name
属性单独选择它们,例如:
<xsl:for-each select="category">
<tr>
<td><xsl:value-of select="info[@name='date']"/></td>
<td><xsl:value-of select="info[@name='filename']"/></td>
</tr>
</xsl:for-each>
或按其职位:
<xsl:for-each select="category">
<tr>
<td><xsl:value-of select="info[1]"/></td>
<td><xsl:value-of select="info[3]"/></td>
</tr>
</xsl:for-each>