XPath: можно ли комбинировать запросы - PullRequest
5 голосов
/ 16 сентября 2011

Рассмотрим следующий 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. В приведенном выше примере будет возвращен только узел " 4 ".

Теперь я знаю, что могу сделать это, запросив все шаги, выполняя итерацию по коллекции и выполняя другой запрос для каждой итерации. Я надеюсь, что есть способ сделать это только с одним запросом. Возможно, использовать что-то вроде оператора IN SQL и подзапроса.

Любые идеи или советы будут наиболее ценными.

Thnx, Christoph

Ответы [ 2 ]

15 голосов
/ 16 сентября 2011

Попробуйте это:

/root/steps/step[not(. = /root/stepDetails/@step)]
0 голосов
/ 16 сентября 2011

как то так?

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...