在 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,'	',revision,'	',comment,' ')"/>
</xsl:template>
<!-- ignore all other text -->
<xsl:template match="text()"/>
</xsl:stylesheet>
这会产生所需的输出:
steve 1 updating file1 and file2
rob 2 reverting file1
我有一些 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,'	',revision,'	',comment,' ')"/>
</xsl:template>
<!-- ignore all other text -->
<xsl:template match="text()"/>
</xsl:stylesheet>
这会产生所需的输出:
steve 1 updating file1 and file2
rob 2 reverting file1