2015-11-04 28 views
0

我想實現的是一種解決方案,即使用XSL中的現有映射來驗證是否支持多個項目。要測試的項目存儲在屬性中(由空格分隔)。XSL - 使用key()對項目列表檢查映射

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

** ** 1的要求是不太清楚 - ESP。關於「required_items」。如果只有*一些*項目被支持,該怎麼辦?請展開您的示例併發布每個案例的預期結果(如代碼)。 - ** 2。**單個屬性中的多個項目=錯誤的XML結構。你有任何控制權? - ** 3。**請說明是否使用XSLT 1.0或2.0。 –

+0

是的,我可以控制它,因爲我們也擁有XSD。 :-)那麼你會推薦添加多個元素嗎? – Sebastian

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

該解決方案即使在XSLT 1.0中也能正常工作(遺憾的是我們不允許升級)。 – Sebastian

+0

@Sebastian不,在XSLT 1.0中不起作用。我問過你 - 兩次 - 關於你的版本,然後發佈我的答案。恐怕我沒有更多時間來解決這個問題了。 –

+0

感謝您的努力! – Sebastian