[英]Using xsl to parse xml output, use of variables?
我正在嘗試解析googletest的xml文件輸出,以便以漂亮的方式在html頁面中顯示結果。 我對此有一個明確的了解,並找到了可行的解決方案。 只剩下一件事要做。 當前,每個類都有一個標題,每個功能和測試都顯示在下面,我正在尋找一種從xml屬性提取函數名稱的方法,以使其具有自己的子標題。 下面的例子
班級名稱
functionName_testName
functionName_test2Name
function2Name_testName
班級名稱
functionName
測試名
test2Name
function2Name
測試名
要解析的XML
<testsuite name="testPacketProcessor" tests="27" failures="0" disabled="0" errors="0" time="36.875">
<testcase name="testInitialise_IpNotSet" status="run" time="0" classname="testPacketProcessor" />
<testcase name="testInitialise_GoodIp" status="run" time="2.046" classname="testPacketProcessor" />
<testcase name="testInitialise_BadIp" status="run" time="0.032" classname="testPacketProcessor" />
</testsuite>
當前實施的XSL
<xsl:for-each select="testsuites/testsuite">
<div class="testHeading">
<span><xsl:value-of select="substring-after(@name,'test')"/></span>
</div>
<xsl:for-each select="testcase">
<div class="testReport">
<xsl:if test="not(starts-with(@name,'DISABLED'))"><xsl:value-of select="substring-after(@name,'test')"/></xsl:if>
<xsl:if test="starts-with(@name,'DISABLED')"><xsl:value-of select="substring-after(@name,'DISABLED_test')"/></xsl:if>
<xsl:text> - </xsl:text>
<xsl:if test="starts-with(@status,'run')">
<xsl:if test="failure"><xsl:text>Fail</xsl:text></xsl:if>
<xsl:if test= "not(failure)"><xsl:text>Pass</xsl:text></xsl:if>
</xsl:if>
<xsl:if test="starts-with(@status,'not')"><xsl:text>Disabled</xsl:text></xsl:if>
</div>
</xsl:for-each>
</xsl:for-each>
以上面的xml為例,我希望在分組處理器標題下有一個“ Initialise”子標題,在該子標題下加倍了每個測試
最好的解決方法的任何建議將不勝感激。 我看過xsl變量,但是無法理解如何處理無法更改值的情況。 還閱讀了一些有關xsl模板和遞歸的知識,但我不確定在這種情況下如何工作。
提前致謝
Dougie
此轉換為每個測試用例生成子標題和名稱 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="testcase">
Subheading: <xsl:value-of select=
"substring-before(substring-after(@name, 'test'),
'_'
)
"/>
Name: <xsl:value-of select="substring-after(@name, '_')"/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
當應用於提供的XML文檔時:
<testsuites>
<testsuite name="testPacketProcessor" tests="27" failures="0" disabled="0" errors="0" time="36.875">
<testcase name="testInitialise_IpNotSet" status="run" time="0" classname="testPacketProcessor" />
<testcase name="testInitialise_GoodIp" status="run" time="2.046" classname="testPacketProcessor" />
<testcase name="testInitialise_BadIp" status="run" time="0.032" classname="testPacketProcessor" />
</testsuite>
</testsuites>
產生想要的正確結果 :
Subheading: Initialise
Name: IpNotSet
Subheading: Initialise
Name: GoodIp
Subheading: Initialise
Name: BadIp
說明 :使用標准XPath函數substring-before()
和substring-after()
編輯 :OP在一條評論中澄清說,他想按功能分組(煩惱的壞問題?):
此轉換執行所需的分組:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kTestsByFunction" match="testcase"
use="substring-before(substring-after(@name, 'test'),
'_'
)"
/>
<xsl:template match=
"testcase
[generate-id()
=
generate-id(key('kTestsByFunction',
substring-before(substring-after(@name, 'test'),
'_'
)
)[1]
)
]
">
Subheading:
<xsl:value-of select=
"substring-before(substring-after(@name, 'test'),
'_'
)
"/>
<xsl:for-each select=
"key('kTestsByFunction',
substring-before(substring-after(@name, 'test'),
'_'
)
)
">
Name:
<xsl:value-of select="substring-after(@name, '_')"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
並產生想要的結果 :
Subheading:
Initialise
Name:
IpNotSet
Name:
GoodIp
Name:
BadIp
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.