我一直在尝试将测试添加到我的xsl:apply templates元素中,但是我一直收到一条错误,上面写着“表达式没有评估到节点集”。我想知道是否有人可以指出我做错了什么来指出我正确的方向。
这是我的XML
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<band>
<guitar>Joe</guitar>
<drums>Rachel</drums>
<bass>Mike</bass>
</band>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<band>
<guitar>Cat</guitar>
<drums>Paul</drums>
<bass>Bobby</bass>
</band>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<band>
<guitar>Eric</guitar>
<drums>Bill</drums>
<bass>Jason</bass>
</band>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
</catalog>
这是我的XSLT:
<?xml version="1.0" encoding="utf-8"?>
<!-- DWXMLSource="Catalog.xml" -->
<!DOCTYPE xsl:stylesheet [
<!ENTITY nbsp " ">
<!ENTITY copy "©">
<!ENTITY reg "®">
<!ENTITY trade "™">
<!ENTITY mdash "—">
<!ENTITY ldquo "“">
<!ENTITY rdquo "”">
<!ENTITY pound "£">
<!ENTITY yen "¥">
<!ENTITY euro "€">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="catalog">
<xsl:apply-templates select="cd" />
</xsl:template>
<xsl:template match="cd">
<p style="color:red;">
<xsl:apply-templates select="title = 'Empire Burlesque'" />
</p>
<p style="color:blue;">
<xsl:apply-templates select="artist = 'Bob Dylan'" />
</p>
<p style="color:green;">
<xsl:apply-templates select="band/guitar = 'Joe'" />
</p>
</xsl:template>
<xsl:template match="title">
Title: <xsl:apply-templates />
</xsl:template>
<xsl:template match="artist">
Artist: <xsl:apply-templates />
</xsl:template>
<xsl:template match="band/guitar">
Guitar: <xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>
我期待的结果是:
Title: Empire Burlesque
Artist: Bob Dylan
Guitar: Joe
答案 0 :(得分:1)
考虑模板
<xsl:template match="cd">
<p style="color:red;">
<xsl:apply-templates select="title = 'Empire Burlesque'" />
</p>
<p style="color:blue;">
<xsl:apply-templates select="artist = 'Bob Dylan'" />
</p>
<p style="color:green;">
<xsl:apply-templates select="band/guitar = 'Joe'" />
</p>
</xsl:template>
这说明了语法问题和逻辑问题。
语法first:给定一个cd元素作为当前节点,表达式“title”计算为一个节点集。表达式“title ='Empire Burlesque'”的计算结果为布尔值。如果要将模板应用于每个具有字符串值'Empire Burlesque'的标题子项,您需要编写类似“title [。='Empire Burlesque']”的内容。修复所有三个选择表达式后,您将获得预期的输出。
现在,逻辑。
将为输入中的每个cd元素评估此模板一次。因此,一旦修复了select表达式,您将获得预期的输出,然后是
<p style="color:red;"/>
<p style="color:blue;"/>
<p style="color:green;"/>
<p style="color:red;"/>
<p style="color:blue;"/>
<p style="color:green;"/>
前三个空段将由Bonnie Tyler CD制作,第三个由Dolly Parton制作。
如果您将HTML视为只写语言,这可能不会造成任何特别的伤害,但在输出中这是一种不必要的丑陋。将您的条件放在正确的位置。
答案 1 :(得分:1)
条件如下:
<xsl:template match="cd">
<p style="color:red;">
<xsl:apply-templates select="title[text()='Empire Burlesque']" />
</p>
<p style="color:blue;">
<xsl:apply-templates select="artist[text()='Bob Dylan']" />
</p>
<p style="color:green;">
<xsl:apply-templates select="band/guitar[text()='Joe']" />
</p>
</xsl:template>