Как включить родительскую ветвь узла, выбранного с помощью параметра xpath, в вывод XSLT

После попыток более 8 часов Я надеюсь, что кто-нибудь может мне помочь с этим:

Учитывая следующий (упрощенный) XML для книги:

<book>
    <section name="A">
        <chapter name="I">
            <paragraph name="1"/>
            <paragraph name="2"/>
        </chapter>
        <chapter name="II">
            <paragraph name="1"/>          
        </chapter>
    </section>
    <section name="B">
        <chapter name="III"/>
        <chapter name="IV"/>   
    </section>
</book>

Я могу извлечь любую часть (раздел, главу или параграф) из XML книги на основе заданного параметр со следующим XSL:

<xsl:param name="subSelectionXPath" required="yes" as="node()"/>

<xsl:template match="/">
    <xsl:apply-templates select="$subSelectionXPath"/>
</xsl:template>

<xsl:template match="*">
    <!-- output node with all children -->
    <xsl:copy-of select="."/>
</xsl:template>

и параметр $ subSelectionXPath со значением вроде

doc(filename)//chapter[@name='II']

, что приводит к выводу:

<chapter name="II">
    <paragraph name="1"/>          
</chapter>

в дополнение к этому я хочу добиться включения выбранного фрагмента XML ветвью XML-предка, то есть:

<book>
    <section name="A">
        <chapter name="II">
            <paragraph name="1"/>          
        </chapter>
    </section>    
</book>

Я представляю (и пробовал) обход XML-дерева и тестирование, является ли текущий узел предком, что-то вроде (псевдокода):

<xsl:if test="node() in $subSelectionXPath/ancestor::node()">
    <xsl:copy>
       <xsl:apply-templates/>
    </xsl:copy>
</xsl:if>

Я также экспериментировал imented с помощью xsl: key, но я боюсь, что мои знания XSLT на этом заканчиваются. Есть мысли?

8
задан Dimitre Novatchev 24 June 2011 в 02:21
поделиться