在 XSLT 中是否可以从具有唯一标识符的列表中获取 select 值

Is it possible in XSLT to select values from a list with a unique identifier

我有一些 XML 数据是这样的:

<modifications>
  <modification>
    <revision>1</revision>
    <file action="modified">
      <filename>file1.cpp</filename>
    </file>
    <user>steve</user>
    <comment>updating file1 and file2</comment>
  </modification>
  <modification>
    <revision>1</revision>
    <file action="modified">
      <filename>file2.cpp</filename>
    </file>
    <user>steve</user>
    <comment>updating file1 and file2</comment>
  </modification>
  <modification>
    <revision>2</revision>
    <file action="modified">
      <filename>file1.cpp</filename>
    </file>
    <user>rob</user>
    <comment>reverting file1</comment>
  </modification>
</modifications>

我在这个数据上使用 xsl:variable 到 select,然后得到如下输出:

steve   1   file1.cpp    modified   updating file1 and file2
steve   1   file2.cpp    modified   updating file1 and file2
rob     2   file1.cpp    modified   reverting file1

是否只有 select 个具有唯一 ID 的值,在本例中为修订版?我意识到这意味着我会丢失一些数据,特别是修改文件的列表,但我可以接受。我希望看到这样的内容:

steve   1   updating file1 and file2
rob     2   reverting file1

这是一个巡航控制日志,它为修订中修改的每个文件输出一个单独的修改元素。

如果您只需要第一次出现的修订号的数据,则可以创建一个 XPath 表达式来匹配 "modifications, whose revision number appears for the first time":

modification[not(preceding::revision = revision)]

但是,由于以上内容也会匹配出现在(前面的)xml 中的修订标签,您可能希望更准确地指定条件以仅匹配 "modifications, whose revision number appears for the first time of any preceding modification":

modification[not(preceding-sibling::modification/revision = revision)]

这是完整的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" version="1.0" encoding="UTF-8"/>
    <!-- match modification tags with NEW revisions -->
    <xsl:template match="modification[not(preceding-sibling::modification/revision = revision)]">
        <xsl:value-of select="concat(user,'&#9;',revision,'&#9;',comment,'&#13;&#10;')"/>
    </xsl:template>
    <!-- ignore all other text -->
    <xsl:template match="text()"/>
</xsl:stylesheet>

这会产生所需的输出:

steve   1   updating file1 and file2
rob     2   reverting file1