Одноименные родные братья и сестры - PullRequest
1 голос
/ 02 января 2012
<corpus>
    <header id="1">
        <file>
            <info>
                <title id="A" />
            </info>
        </file>
    </header>
    <TEI>
        <header id="2">
            <file>
                 <info>
                     <title id="B" />
                 </info>
            </file>
        </header>
        <header id="3">
            <file>
                 <info>
                     <record>
                          <title id="C" />
                     </record>
                 </info>
            </file>
        </header>
        <header id="4">
            <file>
            </file> 
        </header>
    </TEI>
</corpus>
Список

$ представляет собой набор <title> узлов.

Глубина <title> варьируется, но всегда находится где-то ниже <header>. Глубина <header> варьируется, но ее глубина от корня всегда одинакова для всех узлов в данном списке $.

Учитывая $ список, мне нужен цикл for-each, который проходит по заголовкам.

Когда единственным узлом в $ list является заголовок A, мне нужно выполнить цикл только через заголовок 1.

Когда узлами в $ list являются заголовки B и C, мне нужно перебрать заголовки 2, 3 и 4.

1 Ответ

0 голосов
/ 02 января 2012
* +1000 * Используйте
$list/ancestor::header[1]/../header

Проверка на основе XSLT :

<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="vList1" select=
  "/*/header[1]/*/*/title"/>

 <xsl:variable name="vList2" select=
  "/*/TEI//title"/>

 <xsl:template match="/">
  <xsl:copy-of select="$vList1"/>
 ====
  <xsl:copy-of select="$vList2"/>
 ====
  <xsl:copy-of select=
   "$vList1/ancestor::header[1]/../header"/>
 ====
  <xsl:copy-of select=
   "$vList2/ancestor::header[1]/../header"/>
 </xsl:template>
</xsl:stylesheet>

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

<corpus>
    <header id="1">
        <file>
            <info>
                <title id="A" />
            </info>
        </file>
    </header>
    <TEI>
        <header id="2">
            <file>
                <info>
                    <title id="B" />
                </info>
            </file>
        </header>
        <header id="3">
            <file>
                <info>
                    <record>
                        <title id="C" />
                    </record>
                </info>
            </file>
        </header>
        <header id="4">
            <file>
            </file>
        </header>
    </TEI>
</corpus>

выражения XPath оцениваются и в каждом случае требуются header элементы, которые выбираются и выводятся :

<title id="A"/>
 ====
  <title id="B"/>
<title id="C"/>
 ====
  <header id="1">

   <file>

      <info>

         <title id="A"/>

      </info>

   </file>

</header>
 ====
  <header id="2">

   <file>

      <info>

         <title id="B"/>

      </info>

   </file>

</header>
<header id="3">

   <file>

      <info>

         <record>

            <title id="C"/>

         </record>

      </info>

   </file>

</header>
<header id="4">

   <file>

   </file>

</header>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...