背景上下文
我在基于Web的项目管理服务Microsoft Azure DevOps中工作。该服务使您可以编写XSLT模板,以自定义格式将某些信息导出到Word。我一点都不精通XSLT。
我需要访问数据结构元素的属性。问题在于该元素可以在树中的两个不同位置看到,并且它们之间没有父/子关系。
数据结构
请参见下图。在planAndSuites/testPlan/suiteHierarchy/suite
级别,您将看到套件9506是套件9507、9508、9509等的父级。ID碰巧是顺序的,但并不总是如此。套件的级别也可能更多(最底层可以有自己的子级,以下所有级别都称为“套房”)
如果您查看planAndSuites/testSuites/testSuite
,则会找到相同的套件ID号:9506、9507、9508等。这一次,套件已附加了testCase信息。
我想要的
我想访问testCase信息,但我也希望输出显示父级/子级层次结构。我的代码输出层次结构,但是在基于planAndSuites/testSuites/testSuite
的for-each中,我还如何访问planAndSuites/testPlan/suiteHierarchy/suite
中存在的数据考虑到ID将始终匹配。 >
我有什么
当前代码:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" >
<xsl:output method="html" indent="yes" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
<xsl:template match="/">
<xsl:for-each select="planAndSuites" >
<div id="exported-data">
<xsl:for-each select="testSuites">
<xsl:for-each select="testSuite">
<br/>
Test Suite: <xsl:value-of select="@id"/>
PARENT SUITE:
<br/><hr/>
<xsl:for-each select="testCases">
<xsl:for-each select="testCase">
Test case: <xsl:value-of select="@id"/> - <xsl:value-of select="@title"/>
<br/>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
当前输出:
所需的输出:
与上图所示的输出相同,除了PARENT SUITE:
的9506应该显示(无),其他的应该显示9506。
答案 0 :(得分:1)
尝试使用键<xsl:key name="suite-ref" match="planAndSuites/testPlan/suiteHierarchy//suite" use="@id"/>
作为样式表的顶级元素,然后使用PARENT SUITE: <xsl:value-of select="key('suite-ref', @id)/parent::suite/@id"/>
。
答案 1 :(得分:0)
您可以使用(none)
创建一个xsl:choose
条目:
<xsl:for-each select="testSuites">
<xsl:for-each select="testSuite">
<br/>
Test Suite: <xsl:value-of select="@id"/>
PARENT SUITE:
<br/><hr/>
<xsl:choose>
<xsl:when test="count(testCases) = 0">
(none)
</xsl:when>
<xsl:otherwise>
<xsl:for-each select="testCases">
<xsl:for-each select="testCase">
Test case: <xsl:value-of select="@id"/> - <xsl:value-of select="@title"/>
<br/>
</xsl:for-each>
</xsl:for-each>
<xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>