考虑以下XML:
<root>
<steps>
<step>1</step>
<step>2</step>
<step>3</step>
<step>4</step>
</steps>
<stepDetails step="1">Details</stepDetails>
<stepDetails step="2">Details</stepDetails>
<stepDetails step="3">Details</stepDetails>
</root>
我需要做的是找到没有相应stepDetails的所有步骤。在上面的示例中,仅“&lt; step&gt; 4&lt; / step&gt;”节点将被返回。
现在,我知道我可以通过查询所有步骤,迭代集合并为每次迭代执行另一个查询来做到这一点。我希望只用一个查询就可以做到这一点。也许使用类似SQL的IN语句和子查询。
任何想法或提示都将非常受欢迎。
日Thnx, 克里斯托弗
答案 0 :(得分:15)
试试这个:
/root/steps/step[not(. = /root/stepDetails/@step)]
答案 1 :(得分:0)
这样的事情?
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
<xsl:output method="xml" indent="yes"/>
<xsl:key name="steps" match="//root/stepDetails" use="@step" />
<xsl:template match="//root">
<root>
<steps>
<xsl:for-each select="steps/step[not(key('steps',text()))]">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:for-each>
</steps>
</root>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>