我有一些像这样的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
这适用于巡航控制日志,它为修订版中修改的每个文件输出单独的修改元素。
答案 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,'	',revision,'	',comment,' ')"/>
</xsl:template>
<!-- ignore all other text -->
<xsl:template match="text()"/>
</xsl:stylesheet>
这会产生所需的输出:
steve 1 updating file1 and file2
rob 2 reverting file1