2010-04-01 6 views
0

Я работаю с документом OpenXML, обрабатывая основную часть документа с помощью некоторого XSLT.Можно ли перейти к родительскому узлу согласованного узла во время обработки XSLT?

Я выбрал набор узлов с помощью

<xsl:template match="w:sdt"> 
</xsl:template> 

В большинстве случаев, я просто нужно заменить, что согласованный узел с чем-то другим, и это работает отлично.

НО, в некоторых случаях мне нужно заменить не узел w: sdt, который соответствует, но ближайший узел предка w: p (т.е. узел первого абзаца, содержащий узел sdt).

Фокус в том, что условие, используемое для решения того или иного, основано на данных, полученных из атрибутов узла sdt, поэтому я не могу использовать обычный xslt xpath filter.

Я пытаюсь сделать что-то вроде этого

<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 к ш: р узел , НЕ является родительским узлом.

Это почти так, как если бы вы не могли ссылаться на родителя из соответствующего узла. И, может быть, вы не можете, но я не нашел никаких документов, которые говорят, что вы не можете

Любые идеи?

ответ

3

Это:

<xsl:apply-templates select="(ancestor::w:p)/.." mode="backout" /> 

найдет все w:p элементы, которые являются предками контексте узла и применить шаблоны к родительским элементам каждого из них. Это звучит для меня, как, может быть, что вы хотите сделать, это найти только ближайший предок, например .:

<xsl:apply-templates select="ancestor::w:p[1]/.." mode="backout" /> 

Но что вы описываете здесь должны работать, в некотором роде. Вы, вероятно, следует проверить, что вы думаете, что происходит на самом деле, что происходит, заменив свой backout шаблон с чем-то более диагностическом и т.д .:

<xsl:template match="node()" mode="backout"> 
    <xsl:text>backout matched a </xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text> element.</xsl:text> 
</xsl:template> 
+0

Похоже, это был трюк. благодаря – DarinH

1

Если вы уже обработали узел w:p, вы не сможете вернуться в исходное состояние, когда вы встретите узел-потомок w:sdt и замените обработку, выполненную для предка. Вам необходимо определить, нужно ли делать собственное форматирование при обработке самого узла w:p.

Один из способов сделать это, чтобы переопределить шаблон для w:p узлов, так что у вас есть

  • общий шаблон для w:p узлов
  • преобладающего шаблон для w:p узлов, ближайший предок специального случай w:sdt узел

Чтобы определить, w:p является ли ближайшим предком или нет, вы можете использовать xsl:key.

Пример:

<xsl:key name="sdt-descendants" 
     match="w:sdt[@someAttribute='someValue']" 
     use="generate-id(ancestor::w:p[1])"/> 

<xsl:template match="w:p"> 
    <!-- General behavior --> 
</xsl:template> 

<xsl:template match="w:p[key('sdt-descendants', generate-id())]"> 
    <!-- Specific behavior if the element is the closest w:p ancestor to a 
     descendant w:sdt element matching the provided criteria. --> 
</xsl:template> 

Второй шаблон будет использоваться для всех w:p элементов, которые ближе всего предок w:sdt элементов с заданными атрибутами, и первый шаблон будет использоваться для всех других элементов w:p.

0

Подход к обработке родителя после его дочернего элемента является неправильным для приложения XSLT.

Пожалуйста, предоставьте рабочий (но наименьший возможный) пример, содержащий исходный XML-документ и фактическую таблицу стилей xslt. Кроме того, объясните, какой результат должен быть произведен, и как вывод получается из исходного XML-документа.

Это говорит, родитель текущего узла выбирается этим простым выражением XPath:

.. 

 Смежные вопросы

  • Нет связанных вопросов^_^