访问树中其他位置的属性

时间:2019-02-25 21:49:08

标签: xslt

背景上下文

我在基于Web的项目管理服务Microsoft Azure DevOps中工作。该服务使您可以编写XSLT模板,以自定义格式将某些信息导出到Word。我一点都不精通XSLT。

我需要访问数据结构元素的属性。问题在于该元素可以在树中的两个不同位置看到,并且它们之间没有父/子关系。

数据结构

请参见下图。在planAndSuites/testPlan/suiteHierarchy/suite级别,您将看到套件9506是套件9507、9508、9509等的父级。ID碰巧是顺序的,但并不总是如此。套件的级别也可能更多(最底层可以有自己的子级,以下所有级别都称为“套房”)

如果您查看planAndSuites/testSuites/testSuite,则会找到相同的套件ID号:9506、9507、9508等。这一次,套件已附加了testCase信息。

enter image description here

我想要的

我想访问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>

当前输出:

enter image description here

所需的输出:

与上图所示的输出相同,除了PARENT SUITE:的9506应该显示(无),其他的应该显示9506。

2 个答案:

答案 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>