найдите общее родительское использование Xpath

Если это для целей обучения, чтобы настроить Hadoop на Windows, вы найдете достаточно ссылки на блог

. Если ваша основная цель - изучить Hadoop, то я предлагаю вам скачать VMware Player настройте hadoop на ubantu или вы можете скачать версию CDH с сайта cloudera, чтобы начать обучение.

5
задан Nakilon 20 September 2018 в 16:00
поделиться

1 ответ

Используйте следующее выражение XPath 1.0:

$v1/ancestor::*
   [count(. | $v2/ancestor::*) 
   = 
    count($v2/ancestor::*)
   ]
    [1]

где $v1 и $v2 содержат два текстовых узла (в случае, если Вы используете XPath не в XSLT, необходимо будет заменить $v1 и $v2 в вышеупомянутом выражении с выражениями XPath, которые выбирают каждый из этих двух текстовых узлов).

Объяснение:

Вышеупомянутое выражение XPath 1.0 находит пересечение двух наборов узлов: набор узлов всех предков элемента $v1 и набор узлов всех предков элемента $v2. Это сделано с так называемым методом Kaysian для пересечения (после того, как Michael Kay, который обнаружил это в 2000). Используя метод Kaysian для пересечения, пересечения двух наборов узлов, $ns1 и $ns2 выбран следующим выражением XPath:

  $ns1[count(. | $ns2) = count($ns2)]

Затем от пересечения предков мы должны выбрать последний элемент. Однако, потому что мы используем обратную ось (предок), необходимое положение узла должно быть обозначено как 1.

Можно быстро проверить, что вышеупомянутое выражение XPath действительно выбирает самого низкого общего предка путем применения следующего преобразования:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text"/>

  <xsl:variable name="v1" select="/*/*/a/b/text()"/>
  <xsl:variable name="v2" select="/*/*/c/d/text()"/>

  <xsl:variable name="vCommonAncestor" select=
   "$v1/ancestor::*
       [count(. | $v2/ancestor::*) 
       = 
        count($v2/ancestor::*)
       ]
        [1]"
   />

    <xsl:template match="/">
      <xsl:value-of select="name($vCommonAncestor)"/>
    </xsl:template>
</xsl:stylesheet>

при применении на первоначально предоставленный XML-документ (исправленный к правильно построенному XML):

<outer>
    <main>
        <a>
            <b>sometext</b>
        </a>
        <c>
            <d>sometext2</d>
        </c>
    </main>
</outer>

к требуемому результату (название элемента, который является самым низким общим предком двух текстовых узлов) приводят:

основной

Выражение XPath 2.0, которое выбирает самого низкого общего предка этих двух узлов, более просто, потому что оно использует стандартный оператор XPath 2.0, "пересекитесь":

   ($v1/ancestor::* intersect $v2/ancestor::*) 
                                         [last()]
15
ответ дан 18 December 2019 в 09:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: