2012-07-19 31 views
0

我不得不说,XSLT是不是我最好的技能之一:( 我已经读了很多有关排序节点分成不同的组,我设法不同的问题分成不同的组进行排序,但我现在的问题是,我有相同的对象成组重新排序XSLT - 排序节点分成不同的div

我的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> 

我只是需要一个posibilty对这些问题进行排序里面“”并将它们放入不同的div。这对我来说就够了。

你有什么建议吗?尝试了很多,但没有什么工作:(谢谢你很多

编辑2:

我有一些问题XSL属性和用php + 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); 
} 
?> 

任何想法,这是什么可能是

回答

0

你几乎没有怎么样保持简单:?

<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>,将<issue>元素分组为fix_versions@type,但是对于这种情况可能不必要的复杂。

+0

感谢您的回复快:)我会尽力实现这一点。 – KddC 2012-07-19 19:29:00

+0

嘿,我尝试了简单的版本,你的如果以正确的方式先行先试,但已经这样行不通。我编辑我的第一篇文章,以显示我做了什么:)任何想法,这可能是什么问题? 任何想法,这是什么可能是什么? – KddC 2012-07-19 19:34:54

+0

@KddC你为什么不试试我的代码?另外“不起作用”几乎不是我可以采取行动的错误描述。 – Tomalak 2012-07-19 21:29:50