XPath относительно местоположения переменной в исходном документе - PullRequest
4 голосов
/ 12 февраля 2012

При переборе узлов в переменной набора узлов я хочу выражение XPATH 1.0, которое возвращает всех предков узла (например, $ myVariable [7]) - не предков в переменной набора узлов, но предки в оригинальном документе.

Я думал, что один из них будет работать, но не работает.

select="//*[generate-id()=generate-id($myVariable[7])]/ancestor::*"
select="id(generate-id($myVariable[7]))/ancestor::*"

Я рядом?

Редактировать: Это не главное в моем вопросе, но у меня было //ancestor; этот лишний слеш не нужен.

1 Ответ

2 голосов
/ 13 февраля 2012

Ваше выражение лица :

//*[generate-id()=generate-id($myVariable[7])]/ancestor::*

правильно .

Причина, по которой он "не работает", может быть связана с тем, что $myVariable[7] не содержит то, что вы ожидаете.

Вот простой завершенный пример с использованием приведенного выше выражения и выдачей ожидаемого. правильные результаты :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="myVariable"
      select="/*/*/*/*/num"/>

 <xsl:template match="/">
  <xsl:for-each select=
  "//*[generate-id()
      =
       generate-id($myVariable[7])
       ]
        /ancestor::*
  ">
    <xsl:value-of select="name()"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к следующему документу XML :

<a>
    <b>
        <c>
            <nums>
                <num>01</num>
                <num>02</num>
                <num>03</num>
                <num>04</num>
                <num>05</num>
                <num>06</num>
                <num>07</num>
                <num>08</num>
                <num>09</num>
                <num>10</num>
            </nums>
        </c>
    </b>
</a>

желаемый, правильный результат (имена всех предков $myVariable[7]) получается :

a
b
c
nums
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...