После более 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(<em>filename</em>)//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>
Я также экспериментировал с xsl: key, но, боюсь, мои знания о XSLT на этом заканчиваются. Есть мысли?