Найти родителя с одним ребенком с таким же именем - PullRequest
0 голосов
/ 27 ноября 2011

Предположим, у меня есть следующий XML:

<root>
 <parent>
  <name>Luiz</name>
  <son><name>Luiz</name</son>
  <daugther><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Cristina</name>
  <daugther><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Carolina</name>
  <daugther><name>Cristina</name></daughter>
 </parent>
</root>

Какой XPath можно использовать для проверки родителя, чтобы определить, есть ли у него только один дочерний элемент (элементы сын или дочь), имя которого совпадает с именем самого себя.В приведенном выше примере только второй родитель (Кристина) должен был проверить этот тест.Стоит отметить, что у меня может быть много других элементов, кроме сына, дочери, родителя и имени.

1 Ответ

1 голос
/ 27 ноября 2011

Какой XPath можно использовать для проверки родителя, чтобы определить, есть ли у него только один дочерний элемент (элементы сын или дочь), имя которого совпадает с именем самого себя.

Использование:

         /*/parent
               [count(*[self::daughter or self::son]) =1
              and
                name = *[self::daughter or self::son]/name
               ]

При этом выбираются все дочерние элементы верхнего элемента с именем parent, имеющие только один дочерний элемент (кроме дочернего элемента name) и строковое значение их name.дочерний элемент совпадает со строковым значением name дочернего элемента другого (не name) дочернего элемента.

проверка на основе XSLT :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     <xsl:copy-of select=
         "/*/parent
               [count(*[self::daughter or self::son]) =1
              and
                name = *[self::daughter or self::son]/name]
        "/>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному XML-документу (с многочисленными ошибками, исправленными, чтобы сделать его правильно сформированным):

<root>
 <parent>
  <name>Luiz</name>
  <son><name>Luiz</name></son>
  <daughter><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Cristina</name>
  <daughter><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Carolina</name>
  <daughter><name>Cristina</name></daughter>
 </parent>
</root>

оценивает выражение XPath и выводитвсе выбранные узлы (в данном случае только один):

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