过滤.xml然后显示项目,如果剩下任何项目

时间:2011-05-19 12:26:17

标签: xml xslt

我有一个.xml,我需要使用XSL显示。现在,XML中的实体是带有标签的视频。不确定是否重要,但视频可以有多个标签。

目标:我需要做的是(对于特定页面)显示所有标记为“cat1”的项目。这很简单,我只使用if:

<xsl:if test="tag[. =&#34;cat1&#34;]">

但是,如果没有标记为“cat1”的项目,它也不应该列出h1标签 - 只有在有任何带有“cat1”标签的视频时才会显示。

问题:如果有“cat1”的视频存在,没问题。 如果没有标记为“cat1”的视频,则会显示h1标签,但不会显示视频。这显然是不可接受的。

所以问题就变成了;

如何通过检查视频项目来过滤视频项目,并且只有在确定仍有视频后,才会显示剩余的代码?

以下是xml的代码:

<videos>
    <video>
        <title>Video title</title>
        <subtitle></subtitle>
        <description_long>
            <![CDATA[Description]]>
        </description_long>
        <link language="English">http://URL here</link>
        <tag>cat1</tag>
    </video>
</demos>

以下是我一直在尝试的.xsl的代码:

<xsl:template match="/">
    <xsl:for-each select="videos/video">
        <xsl:sort data-type="text" order="ascending" />
        <xsl:if test="tag[. =&#34;cat1&#34;]">
            <h1>Category 1 videos</h1>
            <div class="video">
                <xsl:value-of select="title" />
            </div>
        </xsl:if>
        </xsl:choose>
    </xsl:for-each>
</xsl:template>

1 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="video[tag='cat1'][1]">
  <h1>Category 1 videos</h1>
  <xsl:apply-templates select="../video[tag='cat1']" mode="process"/>
 </xsl:template>

 <xsl:template match="video" mode="process">
  <p><xsl:value-of select="title"/></p>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档(已更正为格式良好并添加了第二个video元素):

<videos>
    <video>
        <title>Video title</title>
        <subtitle></subtitle>
        <description_long><![CDATA[Description]]></description_long>
        <link language="English">http://URL here</link>
        <tag>cat1</tag>
    </video>
    <video>
        <title>Video title 2</title>
        <subtitle></subtitle>
        <description_long><![CDATA[Description]]></description_long>
        <link language="English">http://URL here</link>
        <tag>cat1</tag>
    </video>
</videos>

产生想要的结果

<h1>Category 1 videos</h1>
<p>Video title</p>
<p>Video title 2</p>

应用于此XML文档(无cat1):

<videos>
    <video>
        <title>Video title</title>
        <subtitle></subtitle>
        <description_long><![CDATA[Description]]></description_long>
        <link language="English">http://URL here</link>
        <tag>cat2</tag>
    </video>
    <video>
        <title>Video title 2</title>
        <subtitle></subtitle>
        <description_long><![CDATA[Description]]></description_long>
        <link language="English">http://URL here</link>
        <tag>cat2</tag>
    </video>
</videos

&GT;

再次产生想要的答案(无)。