我不得不说xslt不是我最好的技能之一:(我读了很多关于将节点分类到不同组的文章,并设法将不同的问题分类到不同的组中。但我现在的问题是,我必须再次将相同的对象分组。
我的xml结构看起来像这个
<issues>
<issue status="open" type="Bug">
<fix_versions>6.14.0</fix_versions>
<title>issue1</title>
<description>Description</description>
</issue>
<issue status="open" type="Feature">
<fix_versions>6.13.0</fix_versions>
<title>issue2</title>
<description>Description</description>
</issue>
<issue status="open" type="Improvement">
<fix_versions>6.14.0</fix_versions>
<title>issue3</title>
<description>Description</description>
</issue>
我想要的是有一个像这样的html结构:
<div class="version">
<a>6.14.0</a>
<div class="issues">
<div class="Bugs">
<a href="">issue1</a>
</div>
<div class="Improvements">
<a href="">issue3</a>
</div>
</div>
</div>
<div class="version">
<a>6.13.0</a>
<div class="issues">
<div class="features">
<a href="">issue2</a>
</div>
</div>
</div>
但我得到的只是:
<div class="version">
<a>6.14.0</a>
<div class="issues">
<a href="">issue1</a>
<a href="">issue3</a>
</div>
</div>
<div class="version">
<a>6.13.0</a>
<div class="issues">
<a href="">issue2</a>
</div>
</div>
这是我迄今为止的xslt:
<xsl:for-each select="//issue[generate-id(.)=generate-id(key('versions', fix_versions)[1])]">
<xsl:sort select="fix_versions" order="descending"/>
<div class="release">
<a href="" class="version"><xsl:value-of select="fix_versions"/></a>
<div class="version" style="display:none;">
<xsl:for-each select="key('versions', fix_versions)">
<xsl:if test="@type='Bug'">
<xsl:value-of select="title"/>
</xsl:if>
</xsl:for-each>
</div>
</div>
</xsl:for-each>
我只需要一个职位来对"中的问题进行排序,并将它们放入不同的div中。这对我来说就足够了。
你有什么建议吗?尝试了很多,但都不起作用:(非常感谢
编辑2:
我对php+xsl的xsl属性和美元符号有一些问题:/这就是的结构
<?php
function releaseNotes() {
$xsl = <<<EOB
<xsl:attribute name="version"><xsl:value-of select="fix_versions"/></xsl:attribute>
<xsl:value-of select="$version"/>
EOB;
$xmldoc = new DOMDocument('1.0', 'utf-8');
$xmldoc->load($source);
$xsldoc = DOMDocument::loadXML($xsl);
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsldoc);
return $proc->transformToXML($xmldoc);
}
?>
知道这可能是什么吗?
您就快到了。保持简单:
<xsl:template match="issues">
<xsl:for-each select="
//issue[generate-id(.) = generate-id(key('versions', fix_versions)[1])]
">
<xsl:sort select="fix_versions" order="descending"/>
<xsl:variable name="issueGroup" select="key('versions', fix_versions)" />
<div class="release">
<a href="" class="version">
<xsl:value-of select="fix_versions"/>
</a>
<div class="issues">
<div class="Bugs">
<xsl:apply-templates select="$issueGroup[@type = 'Bug']" />
</div>
<div class="Improvements">
<xsl:apply-templates select="$issueGroup[@type = 'Improvement']" />
</div>
<div class="Features">
<xsl:apply-templates select="$issueGroup[@type = 'Feature']" />
</div>
</div>
</div>
</xsl:for-each>
</xsl:template>
<xsl:template match="issue">
<div class="issue_{@type}">
<a href=""><xsl:value-of select="title" /></a>
<div><xsl:value-of select="description" /></div>
</div>
</xsl:template>
当然,您可以添加另一个<xsl:key>
,它通过fix_versions
和@type
对<issue>
元素进行分组,但在这种情况下,它可能不必要地复杂。