Я работаю с документом OpenXML, обрабатываю основную часть документа с помощью некоторого XSLT.
Я выбрал набор узлов с помощью
<xsl:template match="w:sdt">
</xsl:template>
В большинстве случаев мне просто нужно заменить этот совпадающий узел чем-то другим, и это прекрасно работает.
НО, в некоторых случаях мне нужно заменить не соответствующий узел w: sdt, а ближайший узел предка w: p (т. Е. Первый узел абзаца, который содержит узел sdt).
Хитрость в том, что условие, используемое для определения того или другого, основано на данных, полученных из атрибутов узла sdt, поэтому я не могу использовать типичный фильтр xslt xpath.
Я пытаюсь сделать что-то подобное
<xsl:template match="w:sdt">
<xsl:choose>
<xsl:when test={first condition}>
{apply whatever templating is necessary}
</xsl:when>
<xsl:when test={exception condition}>
<!-- select the parent of the ancestor w:p nodes and apply the appropriate templates -->
<xsl:apply-templates select="(ancestor::w:p)/.." mode="backout" />
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- by using "mode", only this template will be applied to those matching nodes
from the apply-templates above -->
<xsl:template match="node()" mode="backout">
{CUSTOM FORMAT the node appropriately}
</xsl:template>
Вся эта концепция работает, НО, независимо от того, что я пробовал, она всегда применяет форматирование из шаблона CUSTOM FORMAT к узлу w: p, а НЕ к его родительскому узлу.
Это почти как если бы вы не могли ссылаться на родителя из соответствующего узла. И, может быть, вы не можете, но я не нашел никаких документов, которые говорят, что вы не можете
Есть идеи?