首先匹配祖先的名字

时间:2019-02-12 09:45:48

标签: xslt xpath xslt-1.0

您好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节。有解决方案吗?

2 个答案:

答案 0 :(得分:2)

您当前的语句正在选择名称为sectionchapter的所有祖先,并且被选中后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>