2016-03-09 1 views
0

Просьба предложить, как найти «mfrac» присутствует в элементе «msup» в пределах его второй дочерней стороны. (Mfenced является mfenced, когда его содержит «mfrac как его потомок, но только тогда, когда mfrac находится под вторым ребенком позиции MSUP, то следует преобразовать в» мо.)Как идентифицировать элемент, присутствующий в конкретном элементе с определенным местом

  • Когда mfrac находится в пределах первого дочерняя сторона «msup», то «mfenced» не необходимо изменить.
  • Когда mfrac находится в пределах второго ребенка сторона «MSUP», затем «mfenced» для преобразования в «мо»
  • иначе «mfrac» найдено в «mfenced», то «mfenced» нет требуется изменить.

XML:

<article> 
<math><mfenced open="(" close=")"><mfrac><mn>1</mn><mn>2</mn></mfrac></mfenced></math> 
<math><mfenced open="(" close=")"><msup><mfrac><mn>1</mn><mn>2</mn></mfrac><mn>7</mn></msup></mfenced></math> 
<math><mfenced open="(" close=")"><msup><mn>7</mn><mfrac><mn>1</mn><mn>2</mn></mfrac></msup></mfenced></math> 
<math><mfenced open="(" close=")"><msup><mrow><mn>7</mn></mrow><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow></msup></mfenced></math> 
</article> 

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
</xsl:template> 

<xsl:template match="mfenced"> 
    <xsl:choose> 
     <xsl:when test="not(descendant::mfrac[. is ancestor::msup[1]/*[1]/descendant::*])"><!--checking, whether mfrac not found within first child of 'msup' --> 
      <mo><xsl:apply-templates/></mo> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

Требуемый результат:

<article> 
<math><mfenced open="(" close=")"><mfrac><mn>1</mn><mn>2</mn></mfrac></mfenced></math><!--no need alter, because 'mfrac' found within 'mfenced'--> 
<math><mfenced open="(" close=")"><msup><mfrac><mn>1</mn><mn>2</mn></mfrac><mn>7</mn></msup></mfenced></math><!--no need alter, because 'mfrac' found within first child of 'msup' --> 
<math><mo><msup><mn>7</mn><mfrac><mn>1</mn><mn>2</mn></mfrac></msup></mo></math><!--Converted to 'MO', because 'mfrac' is under 2nd child of 'msup' --> 
<math><mo><msup><mrow><mn>7</mn></mrow><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow></msup></mo></math><!--Converted to 'MO', because 'mfrac' is under 2nd child of 'msup' --> 
</article> 
сообщение 0

Ошибка:

XPTY0004: A sequence of more than one item is not allowed as the second operand of 'is' (<mn/>, <mn/>) 

ответ

1

Как насчет:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
    </xsl:template> 

    <xsl:template match="mfenced[ 
     not(mfrac) 
     and (
      msup/mfrac[preceding-sibling::*] 
      or msup//mfrac[not(parent::msup)] 
     ) 
    ]"> 
     <mo><xsl:apply-templates/></mo> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Спасибо за предложение, но я могу иметь то же состояние в пределах '** XSL: когда **', потому что некоторые другие условия данный в пределах выбор. –

+0

Конечно, я не понимаю, почему нет. Но мое предложение состояло бы в том, чтобы просто создать шаблоны для других условий, которые у вас в настоящее время есть '' for. – Tomalak

+0

Спасибо за предложение, плюс один. –

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