0

what I would like to achieve is a solution where an existing mapping in XSL is used to verify that a number of items are supported. Items to be tested are stored in an attribute (separated by whitespace).

<items>
  <item name="item1" supported="true">
  <item name="item2" supported="false">
  <item name="item3" supported="true">
</items>

We are using an additional XML file stating some test cases.

<testsuite name="suite1">
  <testcases>
    <testcase name="test1">
      <required_item name="item1"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test2">
      <required_item name="item1"/>
      <required_item name="item2"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test3">
      <required_item name="item1"/>
      <required_item name="item3"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test4"></testcase>
  </testcases>
</testsuite>

Question: How could we achieve the following pseudo code?

FOREACH testcase
  IF "required_items" is EMPTY
  THEN
    print TEST_TO_RUN += testcase
  ELSE
    IF __ALL__ "required_items" are SUPPORTED
      print TEST_TO_RUN += testcase
    END IF
  END IF
END FOREACH

The expected result in a generated Makefile would look like this.

TEST_TO_RUN+= test1 test3 test4
Sebastian
  • 1
  • 1
  • **1.** The requirement is not quite clear - esp. with regard to "required_items". What if only *some* items are supported? Please expand your example and post the expected result (as code) for each case. -- **2.** Multiple items in a single attribute = bad XML structure. Do you have any control over that? -- **3.** Please state if using XSLT 1.0 or 2.0. – michael.hor257k Nov 04 '15 at 08:23
  • Yes I have control over it, because we own the XSD as well. :-) So would you recommend to add multiple elements instead? – Sebastian Nov 04 '15 at 09:10
  • "*So would you recommend to add multiple elements instead?*" Yes. Otherwise you'll have to tokenize. – michael.hor257k Nov 04 '15 at 09:15
  • Please post the expected result **and** answer my question #3 regarding your XSLT version. – michael.hor257k Nov 05 '15 at 08:04

1 Answers1

0

Given the following well-formed(!) test input:

XML

<items>
  <item name="item1" supported="true"/>
  <item name="item2" supported="true"/>
  <item name="item3" supported="false"/>
  <item name="item4" supported="false"/>
</items>

and an additional document:

testsuite.xml

<testsuite name="suite1">
  <testcases>
    <testcase name="test1">
      <required_item name="item1"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test2">
      <required_item name="item1"/>
      <required_item name="item2"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test3">
      <required_item name="item2"/>
      <required_item name="item3"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test4">
      <required_item name="item3"/>
      <required_item name="item4"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test5"></testcase>
  </testcases>
</testsuite>

the following stylesheet:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>

<xsl:param name="path-to-testsuite" select="'testsuite.xml'"/>

<xsl:key name="item-by-name" match="item" use="@name" />

<xsl:template match="/">
    <xsl:text>TEST_TO_RUN+= </xsl:text>
    <xsl:value-of select="document($path-to-testsuite)/testsuite/testcases/testcase[every $i in key('item-by-name', required_item/@name, current()) satisfies $i/@supported='true']/@name"/>
</xsl:template>

</xsl:stylesheet>

will return:

TEST_TO_RUN+= test1 test2 test5 
michael.hor257k
  • 113,275
  • 6
  • 33
  • 51