Pertanyaan XPath: apakah mungkin untuk menggabungkan kueri


Pertimbangkan XML berikut:

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

Yang harus saya lakukan adalah menemukan semua langkah yang tidak memiliki langkah yang sesuai. Dalam contoh di atas, hanya simpul "<langkah> 4 </ langkah>" yang akan dikembalikan.

Sekarang, saya tahu saya bisa melakukannya dengan menanyakan semua langkah, mengulang melalui koleksi dan melakukan kueri lain untuk setiap iterasi. Saya berharap ada cara untuk melakukannya hanya dengan satu permintaan. Mungkin menggunakan sesuatu seperti pernyataan IN SQL dan sub-query.

Setiap ide atau kiat akan sangat dihargai.

thnx, Christoph


5
2017-09-16 14:13


asal


Jawaban:


Coba ini:

/root/steps/step[not(. = /root/stepDetails/@step)]

15
2017-09-16 14:21



sesuatu seperti ini?

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

0
2017-09-16 14:31