2015-11-27 2 views
0

Просьба предложить вставить пробел между текстом подстрочного текста (msub) и закрывающей скобкой ')', где 'p' - это первый поток потомков ребенка или первого ребенка. (xsl: соответствие шаблона будет иметь текст как фигурные скобки ')'.)Вставить элемент «Пробел» между текстом подстроки и закрывающей скобкой

Есть некоторые критерии для ввода пробелов между текстом «p» и закрывающей скобкой ')'. (В тексте ниже, предположим, р2), как < < суб > > ми р </мл > < млн/мин > </суб >).

Возможно соответствие шаблона «mo», где оно содержит закрывающий кронштейн ')'. См. Комментарии (игнорируйте их), чтобы объяснить требуемый результат. Пожалуйста, предложите.

  • p2) - к p2 < пространство/>) - пространство, необходимое между 'p2' и ')', как 'р' является первым ребенком текст 'msub' или индексов текста.
  • р2 + а) - к р2 + а < пространства/>) - пространство, необходимого между 'p2 + а' и ')', пространство, необходимым, как 'р' является первым дочерним текстом 'msub' или текст подстрочных индексов, а оставшийся текст будет представлен вторым текстом индекса. Из скобки первый предшествующий текст принадлежит SUBSCRIPT.

XML:

<article> 

<math id="m1"> 
    <mo>(</mo> 
    <msub> 
     <mi>p</mi> 
     <mn>2</mn> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m2"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>r</mi></mrow> 
     <mrow><mi>p</mi></mrow> 
    </msub> 
    <mn>8</mn> 
    <mo>)</mo> 
</math> 

<math id="m3"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn></mrow> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m4"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m5"> 
    <mo>(</mo> 
    <mi>p</mi> 
    <mn>2</mn> 
    <mi>t</mi> 
    <mo>)</mo> 
</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="mo"> 
    <xsl:variable name="varPreceded2"> 
     <xsl:value-of select="preceding::text()[normalize-space(.)!=''][2][generate-id(ancestor::math)=generate-id(current()/ancestor::math)]"/> 
    </xsl:variable> 

    <xsl:choose> 
     <xsl:when test="contains(., ')') and matches($varPreceded2, '^(f|j|p|y|g)$') 
      and 
      preceding::text()[normalize-space(.)!=''][2][generate-id(ancestor::math)=generate-id(current()/ancestor::math)] 
      is 
      (preceding::msub[1]/*[1]/descendant-or-self::*[text()][1])"> 
      <mspace/><xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Обязательный Результат (комментарии для пояснения требуемого результата)

<article> 

<math id="m1"> 
    <mo>(</mo> 
    <msub> 
     <mi>p</mi> 
     <mn>2</mn> 
    </msub> 
    <mspace/><!-- Here Space required, because 'before closing bracket first preceded text belongs to MSUB element, and first child of MSUB is having 'p'--> 
    <mo>)</mo> 
</math> 

<math id="m2"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>r</mi></mrow> 
     <mrow><mi>p</mi></mrow> 
    </msub> 
    <mn>8</mn> 
    <!-- Space is not required here, because 'p' is not first child's desendant text, that is second ones--> 
    <mo>)</mo> 
</math> 

<math id="m3"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn></mrow> 
    </msub> 
    <mspace/><!-- Here Space required, because 'before closing bracket first preceded text belongs to MSUB element, and first child of MSUB is having 'p'--> 
    <mo>)</mo> 
</math> 

<math id="m4"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mspace/><!-- Here Space required, because 'before closing bracket first preceded text belongs to MSUB element, and first child of MSUB is having 'p', 'p' is not preceded[2] text, even thou bracket's preceded text is SUBSCRIPT's text where 'p' is first child's text--> 
    <mo>)</mo> 
</math> 

<math id="m5"> 
    <mo>(</mo> 
    <mi>p</mi> 
    <mi>t</mi> 
    <!-- Space not required because 'p' not a part of SUBSCRIPT --> 
    <mo>)</mo> 
</math> 

</article> 

ответ

0

С помощью генерации-идентификаторов (), я получил требуемый результат ...

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="mo"> 
    <xsl:variable name="varPreceded"> 
    <xsl:value-of select="preceding::msub[1]/*[1]/descendant-or-self::text()[1] 
     [generate-id(ancestor::math)=generate-id(current()/ancestor::math)] 
     [generate-id(current()/preceding::msub[1]/*[2]/descendant-or-self::text()[last()]) 
     = 
     generate-id(current()/preceding::text()[normalize-space(.)!=''][1])]"/> 
    </xsl:variable> 

    <xsl:choose> 
     <xsl:when test="contains(., ')') and matches($varPreceded, '^(f|j|p|y|g)$')"> 
      <mspace/><xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

XML:

<article> 

<math id="m1"> 
    <mo>(</mo> 
    <msub> 
     <mi>p</mi> 
     <mn>2</mn> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m2"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>r2</mi></mrow> 
     <mrow><mi>p</mi></mrow> 
    </msub> 
    <mn>8</mn> 
    <mo>)</mo> 
</math> 

<math id="m3"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn></mrow> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m4"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mo>)</mo> 
</math> 

<math id="m5"> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mo>(</mo> 
    <mi>p</mi> 
    <mn>2</mn> 
    <mi>t</mi> 
    <mo>)</mo> 
</math> 

</article> 

Обязательный Результат:

<article> 

<math id="m1"> 
    <mo>(</mo> 
    <msub> 
     <mi>p</mi> 
     <mn>2</mn> 
    </msub> 
    <mspace/><mo>)</mo> 
</math> 

<math id="m2"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>r2</mi></mrow> 
     <mrow><mi>p</mi></mrow> 
    </msub> 
    <mn>8</mn> 
    <mo>)</mo> 
</math> 

<math id="m3"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn></mrow> 
    </msub> 
    <mspace/><mo>)</mo> 
</math> 

<math id="m4"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mspace/><mo>)</mo> 
</math> 

<math id="m5"> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <mo>(</mo> 
    <mi>p</mi> 
    <mn>2</mn> 
    <mi>t</mi> 
    <mo>)</mo> 
</math> 

</article> 
0

Как насчет этого? Согласование на msub было бы гораздо проще, я думаю:

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


     <xsl:if test="contains(following-sibling::mo,')') and contains(child::*[1],'p')"> 
      <space/> 
     </xsl:if> 

</xsl:template> 
</xsl:stylesheet> 
+0

Спасибо за предложение, но мне нужно от матча XPath шаблона «Мо». –

+0

Почему? Я не вижу причин, чтобы сделать задачу сложнее, но, возможно, у вас есть причина, по которой вы не задавали вопрос. –

+0

Не только вставка пространства, некоторый атрибут нужно вставить для элемента «MO», вот почему TEMPLATE MATCH только из MO. (Здесь я не дал формат атрибута, просто мне нужна такая идентификация «MO»). –

1

OK, от "мо" вместо:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"    version="2.0"> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="mo"> 
     <xsl:if test="contains(., ')') and preceding-sibling::*[1][name()='msub'] and contains(preceding-sibling::msub[1]/child::*[1], 'p')"> 

      <xsl:comment>Space here</xsl:comment> 
      <space/> 
     </xsl:if> 
     <mo> 
      <xsl:apply-templates/> 
     </mo> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<article> 

<math id="m1"> 
    <mo>(</mo> 
    <msub> 
     <mi>p</mi> 
     <mn>2</mn> 
    </msub> 
    <!--Space here--><space/><mo>)</mo> 
</math> 

<math id="m2"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>r</mi></mrow> 
     <mrow><mi>p</mi></mrow> 
    </msub> 
    <mn>8</mn> 
    <mo>)</mo> 
</math> 

<math id="m3"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn></mrow> 
    </msub> 
    <!--Space here--><space/><mo>)</mo> 
</math> 

<math id="m4"> 
    <mo>(</mo> 
    <msub> 
     <mrow><mi>p</mi></mrow> 
     <mrow><mn>2</mn><mo>+</mo><mi>s</mi></mrow> 
    </msub> 
    <!--Space here--><space/><mo>)</mo> 
</math> 

<math id="m5"> 
    <mo>(</mo> 
    <mi>p</mi> 
    <mn>2</mn> 
    <mi>t</mi> 
    <mo>)</mo> 
</math> 

</article> 
+0

спасибо за предложение, плюс один, но пространство вставляет даже «под» не сразу перед закрывающей скобкой. например: <математика ID = "m8"> р ( р т<- Пространство здесь ->). Тем не менее, я жду предложений ... –

+0

Итак, это новое требование (этот образец не указан в вашем примере или мне что-то не хватает). Добавьте тест для previous-sibling :: * [1] [name() = 'msub'], как показано выше, чтобы проверить, имеет ли ближайший предшественник-сиблинг «msub» ... Я думаю, что это ваше новое требование. –

+0

Извините, но вопрос указывает пробел между SUB и закрытием BRACKET, см. Пункты списка маркеров. –

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