过滤.xml,然后显示剩余的项目(如果有)
我有一个.xml文件,需要使用XSL显示它。现在,XML中的实体是带有标记的视频。不确定这是否重要,但视频可以有多个标签 目标:我需要做的是(对于特定页面)显示所有标记为“cat1”的项目。这很简单,我将使用if:过滤.xml,然后显示剩余的项目(如果有),xml,xslt,Xml,Xslt,我有一个.xml文件,需要使用XSL显示它。现在,XML中的实体是带有标记的视频。不确定这是否重要,但视频可以有多个标签 目标:我需要做的是(对于特定页面)显示所有标记为“cat1”的项目。这很简单,我将使用if: <xsl:if test="tag[. ="cat1"]"> 但是,如果没有标记为“cat1”的项目,也不应列出h1标记-只有在有标记为“cat1”的视频时才应显示 问题:如果存在“cat1”视频,则没有问题。 如果没有标签为“cat
<xsl:if test="tag[. ="cat1"]">
但是,如果没有标记为“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>
视频标题
http://URL 在这里
第一类
下面是我一直在尝试的.xsl的代码:
<xsl:template match="/">
<xsl:for-each select="videos/video">
<xsl:sort data-type="text" order="ascending" />
<xsl:if test="tag[. ="cat1"]">
<h1>Category 1 videos</h1>
<div class="video">
<xsl:value-of select="title" />
</div>
</xsl:if>
</xsl:choose>
</xsl:for-each>
</xsl:template>
第一类影片
此转换:
<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>
<h1>Category 1 videos</h1>
<p>Video title</p>
<p>Video title 2</p>
产生想要的结果:
<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>
<h1>Category 1 videos</h1>
<p>Video title</p>
<p>Video title 2</p>
1类视频
视频标题
视频标题2
应用于此XML文档时(无cat1):
视频标题
http://URL 在这里
第二类
视频标题2
http://URL 在这里
第二类
再次生成想要的答案(无)。此转换:
<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>
<h1>Category 1 videos</h1>
<p>Video title</p>
<p>Video title 2</p>
产生想要的结果:
<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>
<h1>Category 1 videos</h1>
<p>Video title</p>
<p>Video title 2</p>
1类视频
视频标题
视频标题2
应用于此XML文档时(无cat1):
视频标题
http://URL 在这里
第二类
视频标题2
http://URL 在这里
第二类
再次给出了想要的答案(没有任何结果)。好问题,+1。请参阅我的答案,以获得完整、简短且简单的解决方案。好问题,+1。请参阅我的答案,以获得完整、简短且简单的解决方案。谢谢!这几乎解决了问题。除了一件事:它只列出了一个,因为其中没有for-each。我摆弄过它,但无法让它工作,它只想显示一个项目。@Patrik Fredrikson:我无法重新解释您在这个解决方案中遇到的问题。我编辑了我的答案,现在它包含一个包含两个video
元素的XML文档。结果为它们两个都提供了输出——与您的声明相反,它只显示其中一个的数据。只要复制并粘贴新的XML文档并在其上运行转换——您应该会得到与我得到的相同的答案。我做测试时认为有两个“cat1”实体,而实际上我复制/粘贴了错误的实体。谢谢你。顺便说一下,非常感谢你的帮助。极大地降低了我未来在此项目上的工作量!:)谢谢这几乎解决了问题。除了一件事:它只列出了一个,因为其中没有for-each。我摆弄过它,但无法让它工作,它只想显示一个项目。@Patrik Fredrikson:我无法重新解释您在这个解决方案中遇到的问题。我编辑了我的答案,现在它包含一个包含两个video
元素的XML文档。结果为它们两个都提供了输出——与您的声明相反,它只显示其中一个的数据。只要复制并粘贴新的XML文档并在其上运行转换——您应该会得到与我得到的相同的答案。我做测试时认为有两个“cat1”实体,而实际上我复制/粘贴了错误的实体。谢谢你。顺便说一下,非常感谢你的帮助。极大地降低了我未来在此项目上的工作量!:)