Просьба предложить вставить пробел между текстом подстрочного текста (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>
Спасибо за предложение, но мне нужно от матча XPath шаблона «Мо». –
Почему? Я не вижу причин, чтобы сделать задачу сложнее, но, возможно, у вас есть причина, по которой вы не задавали вопрос. –
Не только вставка пространства, некоторый атрибут нужно вставить для элемента «MO», вот почему TEMPLATE MATCH только из MO. (Здесь я не дал формат атрибута, просто мне нужна такая идентификация «MO»). –