给出以下XML:
<A>
<Photos>
<Photo>
<PhotoID>142</PhotoID>
<PhotoTitle>A</PhotoTitle>
<Comment />
</Photo>
<Photo>
<PhotoID>143</PhotoID>
<PhotoTitle>B</PhotoTitle>
<Comment />
</Photo>
<Photo>
<PhotoID>144</PhotoID>
<PhotoTitle>C</PhotoTitle>
<Comment />
</Photo>
<Photo>
<PhotoID>145</PhotoID>
<PhotoTitle>D</PhotoTitle>
<Comment />
</Photo>
<Photo>
<PhotoID>146</PhotoID>
<PhotoTitle>E</PhotoTitle>
<Comment />
</Photo>
<Photo>
<PhotoID>195</PhotoID>
<PhotoTitle>F</PhotoTitle>
<Comment>Foo</Comment>
</Photo>
<Photo>
<PhotoID>196</PhotoID>
<PhotoTitle>G</PhotoTitle>
<Comment>Bar</Comment>
</Photo>
<Photo>
<PhotoID>197</PhotoID>
<PhotoTitle>H</PhotoTitle>
<Comment>Baz</Comment>
</Photo>
<Photo>
<PhotoID>199</PhotoID>
<PhotoTitle>F</PhotoTitle>
<Comment>qux</Comment>
</Photo>
</Photos>
</A>
我希望获得类似于以下内容的HTML输出:
<div id="photoPage" class="page">
<!-- Page Header Goes Here -->
<div>
<h2>Page Title Goes Here</h2>
<div class="photoBox">
<!-- Image URL goes here -->
<div>
<div>
F
</div>
<div>
Foo
</div>
</div>
</div>
<div class="photoBox">
<!-- Image URL goes here -->
<div>
<div>
F
</div>
<div>
Qux
</div>
</div>
</div>
</div>
<!-- Page Footer Goes Here -->
</div>
<div id="photoPage" class="page">
<!-- Page Header Goes Here -->
<div>
<h2>Page Title Goes Here</h2>
<div class="photoBox">
<!-- Image URL goes here -->
<div>
<div>
G
</div>
<div>
Bar
</div>
</div>
</div>
<div class="photoBox">
<!-- Image URL goes here -->
<div>
<div>
H
</div>
<div>
Baz
</div>
</div>
</div>
</div>
<!-- Page Footer Goes Here -->
</div>
总之,我试图过滤到仅包含标题为&#34; F&#34;,&#34; G&#34;或&#34; H& #34;,按标题和ID排序,然后分成两组。我已经能够完成过滤和排序,但不能进行分页或分页,但不能过滤和排序,但我还没有能够完成所有这三项。
作为参考,我尝试进行类似于{{3}}的分页。
这里的方法不起作用:
<xsl:template name="Photos">
<xsl:copy>
<xsl:apply-templates select="//Photos[Photo/PhotoTitle = 'F' or Photo/PhotoTitle = 'G' or Photo/PhotoTitle = 'H']">
<xsl:sort select="PhotoTitle"/>
<xsl:sort select="PhotoID"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="Photos">
<xsl:param name="pageSize" select="2"></xsl:param>
<xsl:for-each select="//Photos/Photo[position() mod $pageSize = 1]">
<div id="photoPage" class="page">
<div>
<h2>Title</h2>
<xsl:apply-templates select="self::*|following-sibling::*[position() < $pageSize]">
</xsl:apply-templates>
</div>
</div>
</xsl:for-each>
</xsl:template>
<xsl:template match="Photo">
<div class="photoBox">
<!-- img tag -->
<div>
<div>
<xsl:value-of select="./PhotoTitle"/>
</div>
<div>
<xsl:value-of select="./Comment"/>
</div>
</div>
</div>
</xsl:template>
我的想法是我明确调用第一个模板,它应该对Photos元素进行过滤和排序,应用第二个模板,将每个页面的Photo元素拆分并包装成两个,然后应用第三个模板,输出和个体照片。
我目前得到的结果既没有过滤也没有排序,但是被适当地分割。我怀疑这是因为Photos模板与我明确调用的模板分开匹配。
答案 0 :(得分:1)
我的想法是明确调用第一个模板
我发现您发布的代码中没有此类调用。第二个模板会xsl:for-each
选择所有 Photo
,而不会Title
进行过滤。
您的方法的另一个问题是,如果不首先复制已过滤的节点,则无法使用following-sibling
轴(并且,由于您使用的是XSLT 1.0,因此将生成的树片段转换为节点集,因此它可以在第二次通过中处理。)
您还有几个语法错误。
以此为出发点:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:strip-space elements="*"/>
<xsl:template match="A">
<html>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="Photos">
<xsl:param name="pageSize" select="2"/>
<!-- first pass -->
<xsl:variable name="photos">
<xsl:for-each select="Photo[PhotoTitle = 'F' or PhotoTitle = 'G' or PhotoTitle = 'H']">
<xsl:sort select="PhotoTitle"/>
<xsl:sort select="PhotoID" data-type="number"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<!-- output -->
<xsl:for-each select="exsl:node-set($photos)/Photo[position() mod $pageSize = 1]">
<div id="photoPage" class="page">
<div>
<h2>Title</h2>
<xsl:apply-templates select=". | following-sibling::Photo[position() < $pageSize]"/>
</div>
</div>
</xsl:for-each>
</xsl:template>
<xsl:template match="Photo">
<div class="photoBox">
<!-- img tag -->
<div>
<div>
<xsl:value-of select="PhotoTitle"/>
</div>
<div>
<xsl:value-of select="Comment"/>
</div>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,结果将是:
<html>
<body>
<div id="photoPage" class="page">
<div>
<h2>Title</h2>
<div class="photoBox">
<div>
<div>F</div>
<div>Foo</div>
</div>
</div>
<div class="photoBox">
<div>
<div>F</div>
<div>qux</div>
</div>
</div>
</div>
</div>
<div id="photoPage" class="page">
<div>
<h2>Title</h2>
<div class="photoBox">
<div>
<div>G</div>
<div>Bar</div>
</div>
</div>
<div class="photoBox">
<div>
<div>H</div>
<div>Baz</div>
</div>
</div>
</div>
</div>
</body>
</html>