XSL - 使用key()检查项目列表

时间:2015-11-04 06:53:52

标签: xml xslt pseudocode

我想要实现的是一种解决方案,其中使用XSL中的现有映射来验证是否支持许多项。要测试的项目存储在属性中(由空格分隔)。

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

我们正在使用一个额外的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="item1"/>
      <required_item name="item3"/>
    </testcase>
  </testcases>
  <testcases>
    <testcase name="test4"></testcase>
  </testcases>
</testsuite>

问题:我们如何实现以下伪代码?

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

生成的Makefile中的预期结果如下所示。

TEST_TO_RUN+= test1 test3 test4

1 个答案:

答案 0 :(得分:0)

给出以下格式良好的(!)测试输入:

<强> XML

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

和另一份文件:

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

以下样式表:

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>

将返回:

TEST_TO_RUN+= test1 test2 test5