您好XPath / Xslt朋友
我有以下Xml。我想确定cout
元素的第一个匹配部分或章节的ID。如果cout
的最近节点是一个章节,则我将获得该章节的ID,否则将获得该章节的ID。
<book>
<chapter id="chapter1">
<aa>
<cout></cout> --> i will get "chapter1"
</aa>
<section id="section1">
<a>
<b>
<cout></cout> --> i will get section1
</b>
</a>
</section>
<section id="section2">
<a>
<b>
<cout></cout> --> i will get section2
</b>
</a>
</section>
</chapter>
</book>
我尝试了以下语句:
<xsl:value-of select="ancestor::*[local-name() = 'section' or local-name() = 'chapter']/@id" />
,但是如果第1节中包含cout
,它将给我第1章,而不是第1节。有解决方案吗?
答案 0 :(得分:2)
您当前的语句正在选择名称为section
或chapter
的所有祖先,并且被选中后xsl:value-of
仅按文档顺序返回第一个祖先的值(在XSLT 1.0)。
试试看
<xsl:value-of select="ancestor::*[local-name() = 'section' or local-name() = 'chapter'][1]/@id" />
答案 1 :(得分:0)
如果cout
没有祖先section
,则打印chapter
id
否则打印section
ID。
<xsl:for-each select="//cout">
<xsl:if test="count(ancestor::section)= 0">
<xsl:value-of select="ancestor::chapter/@id"/>
</xsl:if>
<xsl:if test="count(ancestor::section)>0">
<xsl:value-of select="ancestor::section/@id"/>
</xsl:if>
</xsl:for-each>