Вернуть любой узел с именем дочернего узла, совпадающим с несколькими

Я хочу получить любой узел с дочерними узлами childTypeA, childTypeB или childTypeC, но не возвращать узлы только с другими дочерними узлами (например, stepChildA). Получив этот узел, я могу получить любой из дочерних узлов и их атрибуты. Но я не могу понять, как отфильтровать те узлы, у которых нет дочерних узлов, соответствующих childTypeA, childTypeB или childTypeC. Мои усилия либо возвращают все узлы с дочерними элементами, либо возвращают узел для каждого соответствующего дочернего элемента, что означает, что один и тот же узел возвращается один, два или три раза, в зависимости от того, существует ли один, два или все три из желаемых дочерних узлов.

С данными XML, как показано

<parent Name="Item one">
    <OtherData Name="Data one">
    <childTypeA>
        <someData Name="Child A">
    </childTypeA>
    <childTypeB>
        <someData Name="Child B">
    </childTypeB>
</parent>
<parent Name="Item two">
    <OtherData Name="Data two">
    <childTypeB>
        <someData Name="Child B">
    </childTypeB>
    <childTypeC>
        <someData Name="Child C">
    </childTypeC>
</parent>
<parent Name="Item three">
    <OtherData Name="Data three">
    <stepChildA>
        <someData Name="Step Child A">
    </stepChildA>
</parent>

Фактические данные для каждого дочернего типа различны, и я пытаюсь собрать их в таблицу, где каждый родительский узел с нужным дочерним типом отображается в одной строке, а дочерние данные выравниваются под соответствующими столбцами. В настоящее время у меня либо есть все родительские узлы, где требуемые данные выглядят как задумано, но также есть строки с другими родительскими узлами, у которых нет данных, или я получаю несколько строк, когда существует более одного желаемого дочернего типа. Данные конкретного дочернего типа попадают в соответствующие столбцы, но не находятся в одной строке.

Мой подход был верным, но мне нужно было переупорядочить код. У меня было "если тест" перед "для каждого". Поменяв их местами, я смог вернуть все родительские узлы, но затем использовал "xsl: if test =...", чтобы игнорировать нежелательных родителей и построить каждую строку таблицы, когда я анализирую дочерние узлы. Примечание. Я добавил сортировку к возвращенным родительским узлам, основываясь на значении их атрибута @Name.

<xsl:for-each select="parent">
    <xsl:sort select="@Name">
    <xsl:if test="childTypeA or childTypeB or childTypeC">
        <tr>.........</tr>
    </xsl:if>
</xsl:for-each>

Мои данные XML очень многословны, и я стараюсь не перегружать пост. Я также борюсь с правилами форматирования.

1 ответ

Насколько я могу судить, вам просто нужно использовать xpath parent[childTypeA | childTypeB | childTypeC] как это:

<xsl:for-each select="parent[childTypeA | childTypeB | childTypeC]">
  <xsl:sort..etc.

</xsl:for-each>
Другие вопросы по тегам