我有一个简单的xml文件,我需要将其转换为包含带有一些嵌套的无序列表的html 这是xml:
<Beer>
<name>Guinnes Draught</name>
<type>stout</type>
<manufacturer>Arthur Guinness Son & Co</manufacturer>
<ingredients>
<ingredient>malt</ingredient>
<ingredient>hop</ingredient>
<ingredient>water</ingredient>
<ingredient>barley</ingredient>
<ingredient>yeast</ingredient>
</ingredients>
<alcChars>
<alcohol>4.2</alcohol>
<density>15</density>
<calories>150</calories>
<filtered>true</filtered>
<package>glass bottle</package>
<volume>0.33</volume>
</alcChars>
</Beer>
这是我的xsl文件(已编辑):
<xsl:template match="/">
<html>
<head>
<title>Beer description</title>
</head>
<body>
<div>Beer:</div>
<ul>
<xsl:apply-templates />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="name">
<li>Name - <xsl:value-of select="." /> </li>
</xsl:template>
<xsl:template match="type">
<li>Type - <xsl:value-of select="." /> </li>
</xsl:template>
<xsl:template match="manufacturer">
<li>Manufacturer - <xsl:value-of select="." /> </li>
</xsl:template>
<xsl:template match="ingredients">
<li>Ingredients: <br/>
<ul>
<xsl:for-each select="ingredient">
<li> <xsl:value-of select="." /> </li>
</xsl:for-each>
</ul>
</li>
</xsl:template>
<xsl:template match="alcChars | nonAlcChars" >
<li>Characteristics: <br/>
<ul>
<xsl:for-each select="*">
<li> <xsl:value-of select="." /> </li>
</xsl:for-each>
</ul>
</li>
</xsl:template>
显然这段代码有些错误,因为输出文件包含头部标题,而主体只有一个<ul>
元素。这个<ul>
包含所有xml数据,但它甚至没有包含在<li>
中。
我对xslt比较陌生,我很感激任何有助于我得到类似内容的建议
<ul>
<li> Name - Guinness </li>
<li> Type - Stout </li>
<li> Chars: <br/>
<ul>
<li> Alc - 4.5 </li>
<li> Dens - 8 </li>
<!-- etc. -->
来自我的xml。
答案 0 :(得分:2)
自从我用xsl完成任务以来已经很长时间了,但是这里......
定义模板时,它在匹配节点的上下文中操作。这意味着节点<name>
是上下文。将xsl:value-of的select属性更改为.
,如此
<xsl:template match="name">
<li>Name - <xsl:value-of select="." /> </li>
</xsl:template>
您也希望对所有其他模板执行此操作。
如果我完全错了,请原谅我。我可能有点生疏。
答案 1 :(得分:1)
除了Marc的答案,你需要改变:
<xsl:for-each select="ingredients">
<li> <xsl:value-of select="ingredient" /> </li>
</xsl:for-each>
为:
<xsl:for-each select="ingredient">
<li> <xsl:value-of select="." /> </li>
</xsl:for-each>
通常情况下,最好使用以下内容:
<xsl:template match="ingredients">
<li>Ingredients: <br/>
<ul><xsl:apply-templates select="ingredient"/></ul>
</li>
</xsl:template>
<xsl:template match="ingredients">
<li><xsl:value-of select="."/></li>
</xsl:template>
然后,您可以执行以下操作:
<xsl:template match="alcChars | nonAlcChars" >
<li>Characteristics: <br/>
<ul><xsl:apply-templates select="*"/></ul>
</li>
</xsl:template>
<xsl:template match="density">
<li>Density - <xsl:value-of select="."/></li>
</xsl:template>
<!-- etc. -->
应该给出你想要的输出。
答案 2 :(得分:0)
因为:
&#34; ...输出文件由头部标题组成,主体只有一个元素。这包含所有xml数据......&#34;
和您的评论:&#34; <ul> Guinnes Draught stout <!-- etc. -->
&#34;
我假设名称空间问题 可能是,您在简化输入XML时隐藏了默认命名空间声明。 如果XML中存在默认命名空间,则必须使用xslt的前缀添加此命名空间,并在模板规则中使用此前缀。
如果你有类似的话:
<Beer xmlns="http://www.beer.org" >
您必须将此网址添加到样式表声明中。像:
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"
xmlns:b="http://www.beer.orgl"
exclude-result-prefixes="b"
version="1.0">
而不是使用这个名称空间前缀,如:
<xsl:template match="b:name">
<li>
Name - <xsl:value-of select="." />
</li>
</xsl:template>