在XSLT中是否可以从具有唯一标识符的列表中选择值

时间:2015-05-12 18:07:17

标签: xslt cruisecontrol

我有一些像这样的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:变量来选择此数据,然后输出如下:

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

无论如何只选择具有唯一ID的值,在这种情况下是修订版吗?我意识到这意味着我会丢失一些数据,特别是修改过的文件列表,但我没关系。我想看到这样的事情:

steve   1   updating file1 and file2
rob     2   reverting file1

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

1 个答案:

答案 0 :(得分:1)

如果您只想要第一次出现修订版号的数据,那么就可以制作一个XPath表达式以匹配修改号,这些修改号的修订号首次出现&#34;:

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

但是,由于上述内容也会匹配修订标记,无论它们出现在(前一个)xml中的哪个位置,您可能希望更准确地指定标准以仅匹配修改,其修订号出现在第一次任何先前的修改&#34;:

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