Вернуть любой узел с именем дочернего узла, совпадающим с несколькими
Я хочу получить любой узел с дочерними узлами 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>