2016-03-09 119 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> 

錯誤消息:

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

當然,我不明白爲什麼不。但我的建議是爲其他條件創建模板,您現在有一個「」。 – Tomalak

+0

感謝您的建議,加上一個。 –