我有一个类似于以下文件:
<catalog>
<cd0>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year></cd0>
<cd1>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd1>
<cd2>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd2>
.
.
.
</catalog>
我想使用for-each函数提取节点<cd1>
,<cd2>
,<cd3>
等的任何元素,但是我找不到方法....
能帮我吗?
答案 0 :(得分:0)
大致猜测您要实现的目标,这里有一些评论:
XSLT中的循环元素很可能是处理XML标签的典型初学者方法。在XML中,您必须改变想法。这意味着不循环标记,而是应用适合特定路径(xpath)的模板。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes" />
<xsl:template match="catalog">
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
<ul>
<xsl:apply-templates />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="catalog/*">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
</xsl:stylesheet>
我添加了一个简单的示例,并在此处进行了一些解释:
catalog
,因此xslt处理器转到“我们在这里很酷”,并开始应用适合-> catalog
的模板。apply-templates
。cd0
,cd1
,并最终找到适合目录的所有子节点(*)的模板。 (并且为了完整起见添加了标题。)希望这可以帮助您前进。不确定是否正在生成该xml-layout,但是该数字不应成为标记名称的一部分。更好:
<cd id="0">
...
</cd>
为什么更好?您可以更轻松地搜索。在这里检查索引:
<xsl:template match="cd[@id='1']">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
在这里检查年份:
<xsl:template match="cd[year/.>1985]">
<li>
<xsl:value-of select="title"/>
</li>
</xsl:template>
学习xsl,您会发现它“产生了太多的输出”。这是因为应用了默认模板,该模板复制遍历的xml标记并将其转储到生成的输出中。我通常会添加一个空的默认模板,它不会写任何内容,因此您拥有完全的控制权。
<xsl:template match="*">
</xsl:template>
对您和遇到的任何人的其他提示:
node()与*
相同,而令人困惑的
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
仅表示:
将此模板用于每个属性(@)节点或(|)每个标记节点(*或node()),并将此节点复制到输出文档中,以递归方式应用并因此迭代源文档。注释标签将被忽略。
希望这可以使每个新手都能获得提升!一旦您知道如何使用它,它实际上就非常酷而且非常有效。