Caroline
Caroline

Reputation: 171

subtracting one variable from another XSLT 3 satisfies

Given this XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pm [
]>
    <pm>
    <content>
        <pmEntry>
     <dmRef>
        <dmRefIdent>
           <dmCode modelIdentCode="S1000DBIKE"
                   systemDiffCode="AAA"
                   systemCode="D00"
                   subSystemCode="0"
                   subSubSystemCode="0"
                   assyCode="00"
                   disassyCode="00"
                   disassyCodeVariant="AA"
                   infoCode="001"
                   infoCodeVariant="A"
                   itemLocationCode="A"/>
           <issueInfo issueNumber="001" inWork="00"/>
           <language countryIsoCode="US" languageIsoCode="en"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Title page</infoName>
           </dmTitle>
           <issueDate day="31" month="12" year="2012"/>
        </dmRefAddressItems>
     </dmRef>
  </pmEntry>
  <pmEntry>
     
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="00" disassyCodeVariant="E01" infoCode="130"
              infoCodeVariant="D" itemLocationCode="A" modelIdentCode="555"
              subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Pre-Flight</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="00" disassyCodeVariant="E02" infoCode="130"
              infoCodeVariant="D" itemLocationCode="A" modelIdentCode="525"
              subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Post-Flight</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     <dmRef>
        <dmRefIdent>
           <dmCode modelIdentCode="FLRA" systemDiffCode="A" systemCode="00" subSystemCode="0" subSubSystemCode="0" 
              assyCode="00" disassyCode="00" disassyCodeVariant="E01" infoCode="131" infoCodeVariant="T" itemLocationCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
               <infoName>Through-Flight Checklist</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     </pmEntry>
  <pmEntry>
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="11" disassyCodeVariant="A01" infoCode="141"
              infoCodeVariant="A" itemLocationCode="A" modelIdentCode="555"
              subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>First Advisory</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="15" disassyCodeVariant="A03" infoCode="141"
              infoCodeVariant="A" itemLocationCode="A" modelIdentCode="555"
              subSubSystemCode="9" subSystemCode="4" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Status Messages</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="20" disassyCodeVariant="A99" infoCode="141"
              infoCodeVariant="A" itemLocationCode="A" modelIdentCode="555"
              subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Last Advisory</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
  </pmEntry>
  <pmEntry>
    <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="01" disassyCodeVariant="C99" infoCode="141" infoCodeVariant="A"
              itemLocationCode="A" modelIdentCode="555" subSubSystemCode="0" subSystemCode="4"
              systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Cautions</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
     <dmRef>
        <dmRefIdent>
           <dmCode assyCode="00" disassyCode="10" disassyCodeVariant="C99" infoCode="141"
              infoCodeVariant="A" itemLocationCode="A" modelIdentCode="555" subSubSystemCode="0"
              subSystemCode="4" systemCode="15" systemDiffCode="A"/>
        </dmRefIdent>
        <dmRefAddressItems>
           <dmTitle>
              <infoName>Cautions End</infoName>
           </dmTitle>
        </dmRefAddressItems>
     </dmRef>
  </pmEntry>
    </content>
    </pm>

And these two variables:

<xsl:variable name="all-DMs" as="item()*" select="descendant::content/pmEntry//dmRef/dmRefIdent/dmCode"/>

<xsl:variable name="flight-DMs" as="item()*" select="descendant::content/pmEntry//dmRef/dmRefIdent/dmCode[@infoCode=('130','131')]"/>

$flight-DMs looks like this, $all-DMs contains all the dmCodes:

<dmCode assyCode="00" disassyCode="00" disassyCodeVariant="E01" infoCode="130"
                  infoCodeVariant="D" itemLocationCode="A" modelIdentCode="555"
                  subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
 <dmCode assyCode="00" disassyCode="00" disassyCodeVariant="E02" infoCode="130"
                  infoCodeVariant="D" itemLocationCode="A" modelIdentCode="525"
                  subSubSystemCode="0" subSystemCode="3" systemCode="15" systemDiffCode="A"/>
 <dmCode modelIdentCode="FLRA" systemDiffCode="A" systemCode="00" subSystemCode="0" subSubSystemCode="0" assyCode="00" disassyCode="00" disassyCodeVariant="E01" infoCode="131" infoCodeVariant="T" itemLocationCode="A"/>

I would like to process $flight-DMs first and then the rest of the DMs with $all-DMs but excluding any dmCode that was already processed in $flight-DMs. I thought the best way was to create a third variable, $filtered-DMs that contained $allDMs - $flight-DMs, (actually I would prefer one variable that contained $flight-DMS and $filtered-DMs so I only have to loop once) but my attempts have failed:

    <xsl:variable name="filtered-DMs" as="item()*" select="$all-DMs[not(.=$flight-DMs)]"/>
<xsl:variable name="filtered-DMs" select="every $x in $all-DMs satisfies not($x=$flight-DMs)"/>

If I try to use contains() or matches() I get an error that the second parameter can't contain more than one sequence:

<xsl:for-each select="every $x in $all-DMs satisfies not(contains($flight-DMs,$x))">

EDIT: I think what I want is:

<xsl:variable name="filtered-DMs" as="item()*" select="$flight-DMs union $all-DMs"/>

Upvotes: 0

Views: 33

Answers (2)

Martin Honnen
Martin Honnen

Reputation: 167716

I think you want e.g. every $item1 in $sequence1 satisfies not(some $item2 in $sequence2 satisfies contains($item1, $item2))

Upvotes: 0

Siebe Jongebloed
Siebe Jongebloed

Reputation: 4870

Given these variables

<xsl:variable name="flightCodes" as="xs:string*" select="('130','131')"/>
<xsl:variable name="all-DMs"     as="element()*" select="descendant::content/pmEntry//dmRef/dmRefIdent/dmCode"/>
<xsl:variable name="flight-DMs"  as="element()*" select="$all-DMs[@infoCode=$flightCodes]"/>

you have 2 options for flight-DMs

<xsl:variable name="non-flight-DMs" as="element()*"    select="$all-DMs[not(@infoCode=$flightCodes)]"/>

<xsl:variable name="non-flight-DMs" as="element()*"    select="$all-DMs except $flight-DMs"/>

Upvotes: 0

Related Questions