Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath:可以组合查询吗_Xml_Xpath - Fatal编程技术网

Xml XPath:可以组合查询吗

Xml XPath:可以组合查询吗,xml,xpath,Xml,Xpath,考虑以下XML: <root> <steps> <step>1</step> <step>2</step> <step>3</step> <step>4</step> </steps> <stepDetails step="1">Details</stepDetails> <stepDet

考虑以下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>

1.
2.
3.
4.
细节
细节
细节
我需要做的是找到所有没有相应步骤详细信息的步骤。在上面的示例中,只返回“4”节点

现在,我知道我可以通过查询所有步骤、迭代集合并为每次迭代执行另一个查询来做到这一点。我希望通过一个查询就可以做到这一点。可能使用类似SQL的IN语句和子查询

任何想法或提示都将不胜感激

thnx, 克里斯托夫

试试这个:

/root/steps/step[not(. = /root/stepDetails/@step)]
像这样的

<?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>


那么反向查询是:/root/stepDetails/@step[不是(.=/root/steps/step)]吗?如果我注释掉任何一个步骤(例如步骤3),XPath查询就会找到它。有没有办法让第4步包含在查询结果中?我不知道你说的反向查询是什么意思,但如果你试图在没有任何对应步骤的情况下查找stepDetails,我会这样做:/root/stepDetails[not(@step=/root/steps/step)]-至于包含第4步,我认为它包含在我在答案中给出的查询结果中?是的,我应该更清楚一点。xpath查询从一个步骤到另一个步骤(这就是我所问问题的答案)。我现在正试图弄清楚反向查询是什么样子的——从stepDetails到步骤(即,查找所有没有相应步骤的stepDetails节点)。删除步骤3节点后,我的注释中的查询将找到步骤=“3”步骤详细信息节点。但我不确定我的xpath是否正确。我还想知道是否有一种方法可以让它同时返回Step4步骤节点和Step3步骤细节节点?