为 XSLT 格式化 XML 个标签

Formatting XML tags for XSLT

我正在尝试使用 XSLT 设置 XML 文件的样式。我有一个 BASH shell 脚本,它使用 WGET 命令每 5 秒从 VLC 媒体播放器下载 XML 文件的副本。下面是 XML 文件的示例部分,其中包含我想使用 XSLT 设置样式的信息。请注意示例 XML,有许多标签以 开头并以 结尾。例如,第一个标签是 1991,第三个标签是 Something in the Way

<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 设置样式的。但是,仅显示第一个 标记。在此示例中,只会显示 1991。我的总体 objective 是在浏览器中只显示乐队名称和歌曲名称。

我实际上有一个我认为非常不寻常的解决方案,那就是在 Linux 与某种类型的 auto_increment 选项结合使用,以查找和替换文本信息,以便 XML 转换为如下所示的内容。然后我可以设置 XSLT 来读取 info1、info2、info3 等等。

<info1>data</info1>
<info2>data</info2>
<info3>data</info3>


很难完成这个不寻常的解决方法,因为 VLC 输出动态信息标签,所以一个 XML 文件可能有 标签,而下一个 XML 文件可能不包含 标记,因此我无法使用期望 $27 始终为 的 AWK 命令。这似乎也不是解决此问题的推荐解决方案,并且可能是一种不稳定的方法,这就是为什么我将问题发布在这里以征求反馈。

我也对 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>

在 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>