嗨,我需要解析以下XML的帮助。
<xmeml>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>1234</Unit2>
</Test>
<Test>
<Unit>bcd</Unit>
<Unit2>2345</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>3456</Unit2>
</Test>
<Test>
<Unit>cde</Unit>
<Unit2>3456</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>1234</Unit2>
</Test>
<Test>
<Unit>def</Unit>
<Unit2>4567</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>1234</Unit2>
</Test>
<Test>
<Unit>efg</Unit>
<Unit2>2345</Unit2>
</Test>
</Doc>
</xmeml>
结果是
<xmeml>
<Doc>
<Test>
<Unit>bcd</Unit>
<Unit2>2345</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>3456</Unit2>
</Test>
<Test>
<Unit>cde</Unit>
<Unit2>3456</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>def</Unit>
<Unit2>4567</Unit2>
</Test>
</Doc>
<Doc>
<Test>
<Unit>abc</Unit>
<Unit2>1234</Unit2>
</Test>
<Test>
<Unit>efg</Unit>
<Unit2>2345</Unit2>
</Test>
</Doc>
</xmeml>
我正试图创建一个xslt文档来完成这项工作,但是到目前为止还没有找到一个有效的。
我应该注意到,在'doc'中所需的匹配参数在本例中是“abc”和“1234”,在现实世界中,这些是变量,永远不会是静态可搜索实体。
所以在英语中,我的xsl应该是这样的:
对于同时包含匹配的“unit”和“unit2”值的任何父级
删除前面所有包含重复值“unit”和“unit2”的父级“test”,最后一个除外。
感谢所有帮助
谢谢
最佳答案
这里有一个相对简单的方法,虽然我很确定有一个更有效的方法使用Meunchian方法。但是,如果性能不是问题,则可能更容易遵循:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="Test">
<xsl:variable name="vUnit" select="Unit" />
<xsl:variable name="vUnit2" select="Unit2" />
<xsl:if test="not(following::Test[Unit = $vUnit and Unit2 = $vUnit2])">
<xsl:call-template name="identity" />
</xsl:if>
</xsl:template>
<xsl:template match="@* | node()" name="identity">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Test
模板只检查Test
和Unit
中是否存在具有相同值的后续Unit2
元素,如果没有,则将其正常输出。