带有OR的XSL Apply模板

时间:2014-08-26 11:40:01

标签: xml xslt

我想申请一个模板,但只适用于第一场比赛。假设我有一个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>

完成

2 个答案:

答案 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>&#10;</xsl:text>
    </xsl:template>

    <xsl:template match="artist[not(../title)]">
        <xsl:text>Artist: </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text>&#10;</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代替matchxsl:apply-templates元素没有match属性。