我有两个节点集,如果没有匹配,我想输出(a)节点的值。逻辑如下:
如果节点集#1中属性“term”的任何值与节点集#2中的“键”属性的任何值都不匹配,则从节点集输出“term”值#1。我该怎么做?
节点集#1
<stuff term="foo" />
<stuff term="bar" />
<stuff term="test" />
节点集#2
<other key="time" />
<other key="rack" />
<other key="foo" />
<other key="fast" />
答案 0 :(得分:1)
假设您的XML看起来像这样
<record>
<stuff>
<stuff term="foo"/>
<stuff term="bar"/>
<stuff term="test"/>
</stuff>
<other>
<other key="time"/>
<other key="rack"/>
<other key="foo"/>
<other key="fast"/>
</other>
</record>
您可以设置一个键,根据键属性
来查找其他元素<xsl:key name="other" match="other/*" use="@key"/>
然后,要选择没有匹配其他元素的内容元素,您可以使用这样的键
<xsl:apply-templates select="stuff/*[not(key('other', @term))]"/>
尝试以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="other" match="other/*" use="@key"/>
<xsl:template match="/*">
<xsl:apply-templates select="stuff/*[not(key('other', @term))]"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于上述XML时,输出如下
<stuff term="bar"></stuff>
<stuff term="test"></stuff>