2014-06-09 38 views
1

如果这是一个愚蠢的问题,再次表示歉意......我目前的情况是,我必须在XSLT中做一些工作,而且我真的不知道很多。我在学习,但我仍然需要帮助理解事情。使用XSLT进行条件打印

之前,我问我的问题,因为这个XML:

<group> 
    <person> 
     <datum type='sex'>f</datum> 
     <datum type='name'>Gina</datum> 
     <datum type='age'>40</datum> 
    </person> 
    <person> 
     <datum type='sex'>m</datum> 
     <datum type='name'>Fred</datum> 
     <datum type='age'>50</datum> 
    </person> 
    <person> 
     <datum type='sex'>m</datum> 
     <datum type='name'>Charles</datum> 
     <datum type='age'>30</datum> 
    </person> 
    <person> 
     <datum type='sex'>f</datum> 
     <datum type='name'>Betty</datum> 
     <datum type='age'>20</datum> 
    </person> 
    <person> 
     <datum type='sex'>?</datum> 
     <datum type='name'>Pat</datum> 
     <datum type='age'>15</datum> 
    </person> 
    <person> 
     <datum type='sex'>?</datum> 
     <datum type='name'>Jamie</datum> 
     <datum type='age'>55</datum> 
    </person> 
</group> 

而这个XSLT:

Transformation

其中产量这样的结果:

Simple output

而且,现在,最后,我的问题。如何修改XSLT,产生的结果是这样的:

formatted output

我想我要跟踪每个人的性别变化何时发生时插入新行,和,因此,这样做这在XSLT中:

<xsl:if test="datum[@type='sex'] != $last"> 

但这是我的问题。我知道XSLT中的变量是不可修改的,所以......完成这个任务的最好方法是什么?我已经在All-Knowing'Net的全部搜索结果中找到了答案,但还没有找到任何有关如何做到这一点的好例子。

一如既往,任何和所有的线索赞赏。

+0

您可以使用分组它生成的代码。如果您使用XSLT 2.0,请查看“for-each-group”的示例。在XSLT 1.0中搜索[Muenchian分组](http://www.jenitennison.com/xslt/grouping/muenchian.html) – helderdarocha

回答

1

这里是一个XSLT 1.0样式产生你想使用Muenchian grouping结果:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes"/> 
    <xsl:key name="sex" match="person" use="datum[@type='sex']"/> 

    <xsl:template match="person"> 
     <tr> 
      <td><xsl:value-of select="datum[@type='name']"/></td> 
      <td><xsl:value-of select="datum[@type='age']"/></td> 
     </tr> 
    </xsl:template> 

    <xsl:template match="group"> 
     <table border="1"> 
     <xsl:for-each select="person[count(. | key('sex', datum[@type='sex'])[1]) = 1]/datum[@type='sex']"> 
      <tr><td colspan="2"><xsl:value-of select="."/></td></tr> 
      <xsl:apply-templates select="//person[datum[@type='sex'] = current()]"/> 
     </xsl:for-each> 
     </table> 
    </xsl:template> 

</xsl:stylesheet> 

您在使用XSLT时,寻找非连续的解决方案。你可以递归地解决许多问题,而不需要改变任何变量的值。

你可以看到在这个XSLT Fiddle

+0

谢谢。不幸的是,您对非顺序解决方案的评论正是为什么我指出我以前从未使用过XSLT。目前,我正试图了解如何使用这项技术,但是我发现的大多数教程并没有真正处理如何使用这种技术。这绝对有帮助。 – EDanaII

+0

好的,后续问题:在我最初的例子中,我包含了一个排序。当我尝试添加它时,在for-each之后,我无法对它进行排序。我在这里错过了什么?我认为这是一个XPath问题,我只是不清楚它可能是什么。 – EDanaII

+0

您可以在'内部包含''来对每个组的内容进行排序。 for-each中的* sort *将对这些组进行排序。 – helderdarocha