только выбрать детей с детьми из XML, используя xslt - PullRequest
1 голос
/ 16 октября 2019

Я пытаюсь получить выходные данные только тех узлов, которые имеют собственные дочерние узлы. Каждый узел проходит уровень 1, для каждого проверяется выражение, и если оно возвращает значение true, мы хотим скопировать все теги уровня 2, имеющие тег уровня 3. Проблема в том, что имена тегов "level2" неизвестны. Только имена узлов "level3" установлены (известны) и одинаковы для всех узлов level3. Ввод будет следующим:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <level1>
    <level2>data</level2>
    <level2>data</level2>
    <level2>
        data
        <level3>data</level3>
    </level2>
    <level2>data</level2>
    <level2>
        data
        <level3>data</level3>
    </level2>
  </level1>
  <level1>
  ....
  </level1>
</root>

Из которого мне понадобятся выходные данные:

<level2>
    data
    <level3>data</level3>
</level2>
<level2>
    data
    <level3>data</level3>
</level2>

Я попытался получить их с помощью:

<xsl:copy>
   <xsl:copy-of select="descendant::level3" />
</xsl:copy>

но это вернет мне только теги "level3" и данные. Можно ли также вернуть родителя того уровня 3, не зная имени этого узла?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Используйте это выражение XPath для выбора следующих элементов:

/*/level1/*[level3]

Это выбирает все дочерние элементы level1 дочерние элементы верхнего элемента, то есть (дочерние элементыlevel1) имеет хотя бы одного level3 дочернего элемента.

Это может быть более общим - предположим, что вы не знаете имен и хотите получить все элементы на глубине 3, у которых еще есть детиэлементы . Тогда одно выражение XPath, выбирающее их:

/*/*/*[*]

Или, если требуемая глубина не известна статически (заранее) - скажем, она задана в переменной $N,затем:

//*[count(ancestor::*) = $N - 1] [*]
0 голосов
/ 16 октября 2019

Из контекста level1 инструкция:

<xsl:copy-of select="*[level3]"/>

скопирует все дочерние элементы текущего level1 элемента, у которого есть дочерний элемент с именем level3, вместе со всеми их потомкамиузлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...