XPath:是否可以组合查询

时间:2011-09-16 14:13:57

标签: xml xpath

考虑以下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, 克里斯托弗

2 个答案:

答案 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>