Заменить текст в узле xml некоторым значением - PullRequest
1 голос
/ 01 августа 2011

предположим, у меня есть xml как

<Fractions>
<Fraction>test 1/3 test aaa</Fraction>
<Fraction>1/2 test</Fraction>
</Fractions>

Я хочу заменить 1/3 with &amp;frac13, 1/2 with @amp;frac12, который находится в строке с использованием xsl, но я застрял. Значения дроби ограничены как

1/2, 1/3, 3/4, 1/4. 

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Если вы можете гарантировать, что входной XML будет иметь только одну цифру, вы можете достичь этого с помощью простых справочных таблиц, которые возвращают имя либо кардинального числа (один, два, три и т. Д.), Либо порядковой формычисла (половина, третье, четвертое и т. д.)

   <ref:cardinals>
      <ref:cardinal>One</ref:cardinal>
      <ref:cardinal>Two</ref:cardinal>
      <ref:cardinal>Three</ref:cardinal>
      ... and so on...
   </ref:cardinals>

   <ref:ordinals>
      <ref:ordinal>Half</ref:ordinal>
      <ref:ordinal>Third</ref:ordinal>
      ... and so on ...
   </ref:ordinals>

(где пространство имен ref должно быть объявлено в верхней части XSLT)

Чтобы искать значения в этих справочных таблицах, вы можете установить переменную, которая ссылается на сам документ XSLT

<xsl:variable name="cardinals" select="document('')/*/ref:cardinals"/>
<xsl:value-of select="$cardinals/ref:cardinal[position() = $numerator]"/>

(где $ числитель - это переменная, содержащая верхнюю половину дроби)

Вот полный документ XSLT, который может справиться со всеми однозначными дробями

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ref="http://stackoverflow.com/users/723763/abdul-muqtadir">
   <xsl:output method="xml" indent="yes"/>

   <ref:cardinals>
      <ref:cardinal>One</ref:cardinal>
      <ref:cardinal>Two</ref:cardinal>
      <ref:cardinal>Three</ref:cardinal>
      <ref:cardinal>Four</ref:cardinal>
      <ref:cardinal>Five</ref:cardinal>
      <ref:cardinal>Six</ref:cardinal>
      <ref:cardinal>Seven</ref:cardinal>
      <ref:cardinal>Eight</ref:cardinal>
      <ref:cardinal>Nine</ref:cardinal>
   </ref:cardinals>

   <ref:ordinals>
      <ref:ordinal>Half</ref:ordinal>
      <ref:ordinal>Third</ref:ordinal>
      <ref:ordinal>Quarter</ref:ordinal>
      <ref:ordinal>Fifth</ref:ordinal>
      <ref:ordinal>Sixth</ref:ordinal>
      <ref:ordinal>Seventh</ref:ordinal>
      <ref:ordinal>Eigth</ref:ordinal>
      <ref:ordinal>Ninth</ref:ordinal>
   </ref:ordinals>

   <xsl:variable name="cardinals" select="document('')/*/ref:cardinals"/>
   <xsl:variable name="ordinals" select="document('')/*/ref:ordinals"/>

   <xsl:template match="Fraction">
      <xsl:variable name="numerator" select="number(substring-before(., '/'))"/>
      <xsl:variable name="denominater" select="number(substring-after(., '/'))"/>
      <xsl:copy>
         <xsl:value-of select="$cardinals/ref:cardinal[position() = $numerator]"/>
         <xsl:text> </xsl:text>
         <xsl:value-of select="$ordinals/ref:ordinal[position() = $denominater - 1]"/>
         <xsl:if test="$numerator != 1">s</xsl:if>
      </xsl:copy>
   </xsl:template>

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

При применении к вашему входному XML возвращается следующий XML

<Fractions>
   <Fraction>One Third</Fraction>
   <Fraction>One Half</Fraction>
</Fractions>

Обратите внимание, что вывозможно, придется посмотреть на обработку множественного числа лучше.Например, если у вас 3/2 в виде дроби, приведенное выше решение возвращает три половины, а не три половины.

0 голосов
/ 01 августа 2011

Если их всего несколько, используйте такие шаблоны:

<xsl:template match="Fraction/text()[.='1/2']">half</xsl:template>
<xsl:template match="Fraction/text()[.='1/3']">one-third</xsl:template>
etc..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...