我对XSL有一些经验,但我现在需要的是比我的技能要高一点,而且我对如何处理它有点困惑。我也环顾了这个网站,并且不认为我找到了类似的东西......虽然我可能错了!
首先,这是我的页面生成的一些XML:
<root>
<content>
<Title>Title 1 here</Title>
<Image>Image Link 1 here</Image>
<Description>Description 1 here</Description>
<Category>Special Exhibitions</Category>
<Priority>2</Priority>
</content>
<content>
<Title>Title 2 here</Title>
<Image>Image Link 2 here</Image>
<Description>Description 2 here</Description>
<Category>Special Exhibitions</Category>
<Priority>1</Priority>
</content>
<content>
<Title>Title 3 here</Title>
<Image>Image Link 3 here</Image>
<Description>Description 3 here</Description>
<Category>Live Music</Category>
<Priority>9</Priority>
</content>
<content>
<Title>Title 4 here</Title>
<Image>Image Link 4 here</Image>
<Description>Description 4 here</Description>
<Category>Lecture</Category>
<Priority>7</Priority>
</content>
<content>
<Title>Title 5 here</Title>
<Image>Image Link 5 here</Image>
<Description>Description 5 here</Description>
<Category>Special Exhibitions</Category>
<Priority>3</Priority>
</content>
<content>
<Title>Title 6 here</Title>
<Image>Image Link 6 here</Image>
<Description>Description 6 here</Description>
<Category>Workshop</Category>
<Priority>10</Priority>
</content>
<content>
<Title>Title 7 here</Title>
<Image>Image Link 7 here</Image>
<Description>Description 7 here</Description>
<Category>Special Exhibitions</Category>
<Priority>6</Priority>
</content>
</root>
基本上,每个<content>
元素都有不同的子元素,包括<Category>
和<Priority>
。
我的问题是我只想选择<Category=Special Exhibition>
的第一个节点,按<Priority>
排序,所以在这种情况下,“标题2”。
这是我到目前为止的XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="root/EventType/Type">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Type">
<xsl:variable name="categoryType" select="." />
<xsl:apply-templates select="../../content[Category=$categoryType]">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="root/content">
<xsl:sort data-type="number" order="ascending" select="Priority"/>
<xsl:if test="(Category='Special Exhibitions')">
<xsl:choose>
<xsl:when test="(position()=1)">
<div class="slide-container">
<img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
<span>
<xsl:attribute name="class">
<xsl:text>slide-caption</xsl:text>
</xsl:attribute>
<xsl:value-of select="Title"></xsl:value-of>
<xsl:text> | </xsl:text>
<xsl:value-of select="Date"></xsl:value-of>
</span>
</div>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
显然我的问题出现在<xsl:if>
和<xsl:when>
部分的某个地方。这就是我的想法如何找到节点,但显然不是XSL的方式!任何人都可以给我一个关于如何攻击它的指针吗?
提前非常感谢 -
答案 0 :(得分:2)
不要使用sort或when。使用xpath选择所需的节点:
<xsl:template match="/">
<xsl:for-each select="/root/content
[Category = 'Special Exhibitions']
[Priority = min(/root/content[Category =
'Special Exhibitions']/Priority)]
[1]">
<div class="slide-container">
<img style="margin-top:18px;" src="{BannerImage}" alt="{Title}" title="{Title}"/>
<span class="slide-caption">
<xsl:value-of select="concat(Title, ' | ', Date)"/>
</span>
</div>
</xsl:for-each>
或者,使用XPath 1.0:
<xsl:for-each select="/root/content
[Category = 'Special Exhibitions']
[not(Priority > /root/content[Category =
'Special Exhibitions']/Priority)]
[1]">
答案 1 :(得分:1)
不知道你实际得到的结果,而不是你想要的结果,我会说改变这些行:
<xsl:for-each select="root/content">
<xsl:sort data-type="number" order="ascending" select="Priority"/>
<xsl:if test="(Category='Special Exhibitions')">
<xsl:choose>
<xsl:when test="(position()=1)">
到
<xsl:for-each select="root/content[Category='Special Exhibitions']">
<xsl:sort data-type="number" order="ascending" select="Priority"/>
<xsl:if test="position()=1">
我这样说是因为你要处理“<Category=Special Exhibition>
的第一个节点,按<Priority>
”排序,而你正在处理第一个节点(根/内容)节点按<Priority>
排序,如果该节点恰好有<Category>=Special Exhibition
。
如果最低优先级内容不属于特殊展览类别,则原始代码不会输出任何内容。当然,您所展示的样本输入并非如此。但由于您没有告诉我们该样本的实际输出是什么,这是我根据可用数据进行的最佳猜测。