После попыток более 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 на этом заканчиваются. Есть мысли?