Первый соответствующий предок, углубляющийся в имя - PullRequest
0 голосов
/ 12 февраля 2019

Здравствуйте, XPath / Xslt Друзья,

У меня есть следующий XML.Я хочу определить идентификатор первого соответствующего раздела или главы моего элемента cout.Если ближайший узел cout является главой, тогда я получу идентификатор главы, в противном случае идентификатор секции.

<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" />

но в случае cout, содержащегося в разделе 1, он даст мне главу 1 вместо раздела 1.Любые решения?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

, если 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>
0 голосов
/ 12 февраля 2019

Ваш текущий оператор выбирает всех предков с именем section или chapter, и после выбора xsl:value-of будет возвращать только значение первого в порядке документа (в XSLT 1.0, то есть).

Попробуйте вместо этого

<xsl:value-of select="ancestor::*[local-name() = 'section' or local-name() = 'chapter'][1]/@id" />
...