根据两个属性值的组合选择唯一节点 [英] Select unique nodes based on a combination of two attribute values
本文介绍了根据两个属性值的组合选择唯一节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一些看起来像这样的 XML:
I have some XML that looks something like this:
<Root>
<Documents>
<Document id="1"/>
</Documents>
<People>
<Person id="1"/>
<Person id="2"/>
</People>
<Links>
<Link personId="1" documentId="1"/>
<Link personId="1" documentId="1"/>
<Link personId="2" documentId="1"/>
</Links>
</Root>
而且我只想获取具有personId"和documentId"的独特组合的Link"元素,因此这两个链接:
And I am interested in getting only the 'Link' elements that have a unique combination of 'personId's and 'documentId's, so these two links:
<Root>
<Links>
<Link personId="1" documentId="1"/>
<Link personId="2" documentId="1"/>
</Links>
</Root>
我该怎么做呢?我发现了这个问题,尽管我觉得我的问题稍微复杂一些并且可能不适用...我想我需要在某处使用 key() 函数...
How might I go about doing that? I have found this question, though I feel mine is slightly more complex and may not apply...I presumme I am going to need to use the key() function somewhere...
提前致谢.
推荐答案
此样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kDocAndPeoById" match="Document|Person" use="@id"/>
<xsl:key name="kLinksByIds" match="Link"
use="concat(@personId,'++',@documentId)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Documents|People|
Link[count(.|key('kLinksByIds',concat(@personId,'++',@documentId))[1])!=1
or not(key('kDocAndPeoById',@personId)/self::Person)
or not(key('kDocAndPeoById',@documentId)/self::Document)]"/>
</xsl:stylesheet>
输出:
<Root>
<Links>
<Link personId="1" documentId="1"></Link>
<Link personId="2" documentId="1"></Link>
</Links>
</Root>
如果你没有兴趣检查是否有这样的 Document 或 Person @id,那么这个样式表:
If you have no interest into checking if there is such Document or Person @id, then this stylesheet:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kLinksByIds" match="Link"
use="concat(@personId,'++',@documentId)"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Documents|People|
Link[count(.|key('kLinksByIds',concat(@personId,'++',@documentId))[1])!=1]"/>
</xsl:stylesheet>
输出:
<Root>
<Links>
<Link personId="1" documentId="1"></Link>
<Link personId="2" documentId="1"></Link>
</Links>
</Root>
这篇关于根据两个属性值的组合选择唯一节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文