Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 访问树中其他位置的属性_Xslt - Fatal编程技术网

Xslt 访问树中其他位置的属性

Xslt 访问树中其他位置的属性,xslt,Xslt,背景语境 我在Microsoft Azure DevOps工作,这是一个基于web的项目管理服务。该服务允许您编写XSLT模板,以自定义格式将某些信息导出到Word。我一点也不精通XSLT 我需要访问数据结构元素的属性。问题在于,元素可以在树中的两个不同位置看到,并且它们没有父/子关系 数据结构 请看下图。在planAndSuites/testPlan/suiteHierarchy/suite级别,您将看到suite 9506是suite 9507、9508、9509等的父级。ID恰好是顺序的,

背景语境

我在Microsoft Azure DevOps工作,这是一个基于web的项目管理服务。该服务允许您编写XSLT模板,以自定义格式将某些信息导出到Word。我一点也不精通XSLT

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

数据结构

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

如果您查看planAndSuites/testSuites/testSuite,您将发现相同的套件ID号:9506、9507、9508等。这一次,套件附带了测试用例信息

我想要什么

我希望访问testCase信息,但我也希望输出显示父/子层次结构级别。我的代码输出层次结构,但在基于planAndSuites/testPlan/suiteHierarchy/suite的for each中,我如何访问planAndSuites/testSuites/testSuite中的数据,因为考虑到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>
电流输出:

期望输出:

与图中的输出相同,除了父套件:应为9506显示“无”,其他的应为9506。

您可以使用xsl:choose创建“无”条目:


尝试将一个键作为样式表的顶级元素,然后使用父套件:。

因此它应该为每个项目显示相同的测试套件:9506?@zx485,以及我在问题中输入的数据,是的,除了9506,因为它没有父项。事实上,我有更多的数据,有时家长不会是9506。感谢您的想法,但一些套件将没有测试用例,但这并不意味着他们将没有家长。子/父层次结构不依赖于测试用例的计数。这取决于树的suiteHierarchy部分,它在我当前所在的树的testSuite部分之外。嗨,Martin,这是可行的,但我不明白为什么。请解释一下第二行代码是如何工作的好吗?xsl:key声明是对XSLT处理程序的一个提示/请求,用于根据id属性值对匹配的planAndSuites/testPlan/suiteHierarchy//suite元素进行索引。这样,使用适当id值调用的键函数就可以有效地找到引用的元素。因此,testSuite上下文中的key'suite-ref',@id为我们提供了具有相同id的相关套件,然后您说您希望导航到父套件并输出其id属性,因此在XPath parent::suite/@id中,所有表达式key'suite-ref',@id/parent::suite//id。这些都是在现有教程和书籍中找到的基本XPath和XSLT内容,例如。
<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>