Xml 使用XSLT的条件打印

Xml 使用XSLT的条件打印,xml,xslt,printing,conditional,Xml,Xslt,Printing,Conditional,再次道歉,如果这是一个愚蠢的问题。。。我目前的情况是,我必须在XSLT中做一些工作,但我对它了解得并不多。我在学习,但我仍然需要帮助理解事物 在我提问之前,考虑到以下XML: <group> <person> <datum type='sex'>f</datum> <datum type='name'>Gina</datum> <datum type='age'&

再次道歉,如果这是一个愚蠢的问题。。。我目前的情况是,我必须在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>

F
吉娜
40
M
弗莱德
50
M
查尔斯
30
F
贝蒂
20
?
拍打
15
?
杰米
55
这个XSLT:

这就产生了这个结果:

最后,我的问题。如何修改XSLT以产生如下结果:

我假设我想跟踪每个人的性别何时发生变化,并在发生变化时插入新行,因此,在XSLT中执行如下操作:

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

但这是我的问题。我知道XSLT中的变量是不可修改的,所以。。。完成这项任务的最佳方式是什么?我已经在无所不知的网络上搜索了答案,但没有找到任何关于如何做到这一点的好例子


一如既往,任何和所有线索都值得欣赏。

这里是一个XSLT 1.0样式表,它使用以下方法生成您期望的结果:


使用XSLT时,必须寻找非顺序解决方案。您可以递归地解决许多问题,而不需要更改任何变量的值


您可以在这个

中看到它生成的代码,您可以使用分组。如果您使用的是XSLT2.0,请查看每个组的
示例。在XSLT1.0中搜索“谢谢”。不幸的是,您对非顺序解决方案的评论正是我指出我以前从未使用过XSLT的原因。目前,我正在努力理解如何使用这项技术,但我在那里找到的大多数教程并没有很好地告诉我如何使用这项技术。这肯定有帮助。好的,接下来的问题:在我最初的示例中,我包含了一个排序。当我尝试重新添加它时,在for each之后,我无法对它进行排序。我错过了什么?我假设这是一个XPath问题,我只是不清楚它可能是什么。您可以将
包含在
中,以对每个组的内容进行排序。for each中的排序将对组进行排序。找到它。除了这个,我什么都试过了。我假设的意思和我插入的相同。好的,如果可以的话,再问一个后续问题。如果我们要排序的值是空/空的,那么如何对该空值进行排序,就好像它有一个值一样?所以,忘了性是被定义为“?”的,而是没有价值的,我如何让它像“?”一样排序呢?
<?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>