Я пытаюсь выбрать значение узла-предка ‹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› иногда имеет двойную, а иногда и тройную вложенность.
ancestor::li[2]
выбирает второго предка<li>
, глядя вверх от начального узла, посколькуancestor::
является обратной осью. Если вам нужен ближайший, измените его наancestor::li[1]
- person keshlam   schedule 19.03.2014