2015-05-12 98 views
0

У меня есть некоторые XML-данные, как это:Можно ли в XSLT для выбора значений из списка с уникальным идентификатором

<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 

Нужно ли только выбирать значения с уникальным идентификатором, в данном случае ревизией? Я понимаю, это означало бы, что я потеряю некоторые данные, в частности список измененных файлов, но я в порядке. Я хотел бы увидеть что-то вроде этого:

steve 1 updating file1 and file2 
rob  2 reverting file1 

Это для журнала круиз-контроль, который выдает отдельный элемент модификации для каждого файла модифицированного в правке.

+0

вы используете XSLT 1.0 или 2.0? –

ответ

1

Если вы хотите только данные из первого вхождения номер ревизии, то можно сделать выражение XPath, чтобы соответствовать «модификации, чей номер версии появляется в первый раз»:

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

Однако, как указано выше, также будут соответствовать тегам проверки, где бы они ни появлялись в (предыдущем) xml, вы можете более точно указать критерии, чтобы соответствовать только «модификациям, номер версии которых появляется в первый раз для любой предыдущей модификации»:

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 
+2

Вам нужно узнать о [Muenchian grouping] (http://www.jenitennison.com/xslt/grouping/muenchian.html), который обеспечивает гораздо лучшее решение для XSLT 1.0. В XSLT 2.0 это может обрабатываться '' или функцией 'distinct-values ​​()'. –