祖先的同名兄弟姐妹

时间:2012-01-02 00:03:37

标签: xslt xpath

<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>

$ list是一组<title>个节点。

<title>的深度各不相同,但始终位于<header>之下。 <header>的深度会有所不同,但对于给定$列表中的所有节点,其从根的深度始终相同。

给定一个$ list,我需要一个循环遍历头的for-each循环。

当$ list中唯一的节点是标题A时,我只需要通过标题1循环。

当$ list中的节点是标题B和C时,我需要遍历标题2,3和4。

1 个答案:

答案 0 :(得分:0)

使用

$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>