Какой 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>