假设我有以下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来测试父级,以查看它是否只有一个与其自身名称相同的子级(子元素或子元素)。在上面的例子中,只有第二个父母(Cristina)会验证测试。值得一提的是,除了儿子,女儿,父母和名字,我可能还有许多其他元素。
答案 0 :(得分:1)
我可以使用什么XPath来测试父母,看看它是否只有一个孩子 (元素儿子或女儿)与自己的名字相同。
使用强>:
/*/parent
[count(*[self::daughter or self::son]) =1
and
name = *[self::daughter or self::son]/name
]
这将选择名为parent
的top元素的所有子元素,只有一个子元素(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>