我想申请一个模板,但只适用于第一场比赛。假设我有一个xml:
<cd>
<title>Red</title>
<artist>The Communards</artist>
<country>UK</country>
<company>London</company>
<price>7.80</price>
<year>1987</year>
</cd>
<cd>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
请注意,第二张CD没有标题节点。 和xsl:
<xsl:template match="title">
Title: <xsl:value-of select="."/><br/>
</xsl:template>
<xsl:template match="artist">
Artist: <xsl:value-of select="."/><br/>
</xsl:template>
如果有节点标题我想要应用该模板,否则我想要为艺术家应用模板。我正在尝试像
这样的东西<xsl:apply-templates select="title | artist"/>
但那时它会使用两个,我只想要应用第一个。因此,如果有标题,请使用该标题,否则请使用艺术家。这可以通过这种方式完成,还是仅使用<xsl:choose>
?
答案 0 :(得分:2)
如果有节点标题我想要应用该模板,否则我 想要为艺术家应用模板。
撰写与title
<xsl:template match="title">
和另一个artist
,假设其父节点没有子title
元素。
<xsl:template match="artist[not(../title)]">
假设输入正确(您显示的XML格式不正确,因为没有单个文档元素),您可以应用下面的样式表。
<强>样式表强>
如果样式表输出文本,建议将其放在xsl:text
元素中。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="text" encoding="UTF-8" indent="yes" />
<xsl:template match="title">
<xsl:text>Title: </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="artist[not(../title)]">
<xsl:text>Artist: </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="text()"/>
</xsl:transform>
XML输出
Title: Red
Artist: Joe Cocker
答案 1 :(得分:1)
尝试:
<xsl:apply-templates select="(title | artist)[1]"/>
请注意使用select
代替match
。 xsl:apply-templates
元素没有match
属性。