Доступ к свойству в другом месте дерева - PullRequest
0 голосов
/ 26 февраля 2019

Фоновый контекст

Я работаю в Microsoft Azure DevOps, веб-службе управления проектами.Сервис позволяет писать шаблоны XSLT для экспорта некоторой информации в Word в пользовательских форматах.Я совсем не разбираюсь в XSLT.

Мне нужен доступ к свойствам элемента моей структуры данных.Проблема заключается в том, что элемент можно увидеть в двух разных местах дерева, и у них нет родительских / дочерних отношений.

Структура данных

См. Вкартинка ниже.На уровне planAndSuites/testPlan/suiteHierarchy/suite вы увидите, что набор 9506 является родителем наборов 9507, 9508, 9509 и т. Д. Идентификаторы бывают последовательными, но это не всегда так.Также может быть больше уровней наборов (нижний уровень может иметь собственных дочерних элементов, и все последующие уровни будут называться «набор»)

Если вы посмотрите на planAndSuites/testSuites/testSuite, вы найдете тот же наборИдентификационные номера: 9506, 9507, 9508 и т. Д. На этот раз к люксам прикреплена информация testCase.

enter image description here

Что я хочу

Я хочу получить доступ к информации testCase, но я также хочу, чтобы выходные данные отображали уровни иерархии родительский / дочерний.Мой код выводит иерархию, но как мне ТАКЖЕ получить доступ к данным, присутствующим в planAndSuites/testSuites/testSuite, когда в for-each на основе planAndSuites/testPlan/suiteHierarchy/suite , учитывая, что идентификатор всегда будет соответствовать .

Что у меня есть

Текущий код:

<?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 голосов
/ 26 февраля 2019

Попробуйте ввести ключ <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"/>.

0 голосов
/ 26 февраля 2019

Вы можете создать запись (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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...