我有一个主要的xslt cdcatalog.xsl
并链接到xml文件cdcatalog.xml
。
我正在尝试根据country
中的值动态应用模板。一些实际模板是外部.xsl
文件。
cdcatalog.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="cdcatalog_in.xsl"/>
<xsl:include href="cdcatalog_usa.xsl"/>
<xsl:include href="cdcatalog_uk.xsl"/>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist">
Artist: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
</xsl:stylesheet>
cdcatalog.xml 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="cdcatalog.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
</cd>
<cd>
<title>Still got the blues</title>
<artist>Gary Moore</artist>
<country>IN</country>
<company>Virgin records</company>
<price>10.20</price>
<year>1990</year>
</cd>
</catalog>
cdcatalog_in.xsl 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="cd[country='IN']" name="IN" >
<h4>Country: India</h4>
</xsl:template>
</xsl:stylesheet>
cdcatalog_usa.xsl 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="cd[country='USA']" name="USA" >
<h4>Country: United States of America</h4>
</xsl:template>
</xsl:stylesheet>
cdcatalog_uk.xsl 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="cd[country='UK']" name="UK" >
<h4>Country: United Kingdom</h4>
</xsl:template>
</xsl:stylesheet>
预期输出
Title : Empire Burlesque
Artist: Bob Dylan
Country: United States of America
Title : Hide your heart
Artist: Bonnie Tyler
Country: United Kingdom
Title : Greatest Hits
Artist: Dolly Parton
Country: United States of America
Title : Still got the blues
Artist: Gary Moore
Country: India
获取不正确的输出
My CD Collection
Country: United States of America 2
Country: United Kingdom
Country: United States of America 2
Country: India
先谢谢。 作者Srini
答案 0 :(得分:2)
问题:您有两个匹配同一节点的模板,您需要同时应用这两个模板。
解决方案:而不是包括外部样式表,导入。然后在本地模板中使用xsl:apply-imports
来应用导入的模板。
无需修改外部样式。
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="cdcatalog_in.xsl"/>
<xsl:import href="cdcatalog_usa.xsl"/>
<xsl:import href="cdcatalog_uk.xsl"/>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
<xsl:apply-imports />
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist">
Artist: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
</xsl:stylesheet>
Alernatively,您可以使用模式 - 但仍然无需修改外部样式表:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="cdcatalog_in.xsl"/>
<xsl:include href="cdcatalog_usa.xsl"/>
<xsl:include href="cdcatalog_uk.xsl"/>
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates mode="first"/>
</body>
</html>
</xsl:template>
<xsl:template match="cd" mode="first" >
<p>
<xsl:apply-templates select="." />
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
<xsl:template match="title">
Title: <span style="color:#ff0000">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
<xsl:template match="artist">
Artist: <span style="color:#00ff00">
<xsl:value-of select="."/></span>
<br />
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
模式在这里很有用。将包含的模板规则更改为:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="cd[country='IN']" mode="country-name">
<h4>Country: India</h4>
</xsl:template>
</xsl:stylesheet>
并将通用模板规则更改为:
<xsl:template match="cd">
<xsl:apply-templates select="." mode="country-name"/>
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
答案 2 :(得分:1)
您是否有机会更改包含的xslt文件?如果是这样,您可以将其更改为与country
而非cd
匹配。例如, cdcatalog_in.xsl 文件如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="cd/country[.='IN']">
<h4>Country: India</h4>
</xsl:template>
</xsl:stylesheet>
然后,在您的主XSLT文件中,匹配cd
的模板将如下所示
<xsl:template match="cd">
<p>
<xsl:apply-templates select="country"/>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="artist"/>
</p>
</xsl:template>
您甚至可以在主XSLT中添加仅匹配country
的模板,以捕获“未知”案例
<xsl:template match="country">
<h4>Country: UNKOWN</h4>
</xsl:template>
答案 3 :(得分:-1)
除了为每个计数使用多个xsl文件之外,所有cd
元素都可以使用模板在单个xsl中完成。
以下是修改过的单一样式表: cdcatalog.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="cd">
<p>
Title: <span style="color:#ff0000">
<xsl:value-of select="./title"/></span><br/>
Artist: <span style="color:#00ff00">
<xsl:value-of select="./artist"/></span><br/>
Country: <span style="color:#00ff11">
<xsl:choose>
<xsl:when test="./country = 'IN'">
India
</xsl:when>
<xsl:when test="./country = 'UK'">
United Kingdom
</xsl:when>
<xsl:when test="./country = 'USA'">
United States of America
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="./country"/>
</xsl:otherwise>
</xsl:choose>
</span><br/>
</p>
</xsl:template>
</xsl:stylesheet>
这是输出:
希望这适合您的需要。