xquery: выберите предка на несколько уровней выше родителя

Я пытаюсь выбрать значение узла-предка ‹li› непосредственно перед родительским узлом. Вот образец документа im-trg.xml:

<trg>
<category>
    <h2>Accounting and Auditing</h2>
    <ul>
    <li>Laws and Regulations
        <ul>
            <li><a href="url1">Regulation S-X</a></li>
        </ul>
    </li>
    <li>Staff Guidance
        <ul>
            <li>No Action Letters
                <ul>
                    <li><a href="url2">Robert Van Grover, Esq., Seward and Kissel LLP</a> (November 5, 2013)</li>
                </ul>
            </li>
        </ul>
    </li>
    </ul>
</category>
</trg>

Вот мой запрос:

for $x in doc("C:\im-trg.xml")//li/a
return 
<item>
<title>{data($x)}</title>
<documentType>{data($x/ancestor::li[2])}</documentType>
<category>{data($x/ancestor::category/h2)}</category>
</item>

Я получаю:

<item>
  <title>Regulation S-X</title>
  <documentType>Laws and RegulationsRegulation S-X</documentType>
  <category>Accounting and Auditing</category>
</item>

Для ‹documentType› я хочу выбрать только предка ‹li›, непосредственно предшествующего родителю ‹li› ‹a›, который указывает тип документа, поэтому я хочу:

<item>
  <title>Regulation S-X</title>
  <documentType>Laws and Regulations</documentType>
  <category>Accounting and Auditing</category>
</item>

а также

<item>
  <title>Robert Van Grover, Esq., Seward and Kissel LLP</title>
  <documentType>No Action Letters</documentType>
  <category>Accounting and Auditing</category>
</item>

Я не думаю, что смогу выйти из корня, потому что родитель ‹li› иногда имеет двойную, а иногда и тройную вложенность.


person user3342258    schedule 19.03.2014    source источник
comment
ancestor::li[2] выбирает второго предка <li>, глядя вверх от начального узла, поскольку ancestor:: является обратной осью. Если вам нужен ближайший, измените его на ancestor::li[1]   -  person keshlam    schedule 19.03.2014
comment
правильно, li[1] совпадает с родителем, li[2] — это следующий li по направлению к корню. Текст li[2] я хочу захватить, чтобы заполнить элемент xml (значение documentType), но без текста из дочернего ul/lis. Я не могу понять, почему я получаю li[2] + li[1]. Возможно, возврат правильный, в этом случае li[1] является потомком li[2], поэтому возвращаются оба.   -  person user3342258    schedule 20.03.2014


Ответы (1)


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

data($x/ancestor::li[2]/text())
person keshlam    schedule 19.03.2014