XSLT: как сопоставить точное текстовое значение внутри элемента и заменить

Мне нужно найти определенное текстовое значение в документе, "метод", и для каждого экземпляра заменить это текстовое значение "метод" следующим:

элемент для замены метода

Это значение метода может появляться в документе несколько раз. Проблема в том, что мне также нужно сохранить оставшийся текст внутри элемента, кроме "метода", который будет заменен.

      <section id="1">
        <title>Methods</title>
            <p>The test method blah has 6 types of methods available</p>
            <p>With the exception of a specific method<p
        </section>
     <section id="2">
        <title>Organisations</title>
            <p>The organisation has a method</p>
        </section>

Я не уверен, что использование fn: replace будет лучшим подходом, и если мне нужно будет использовать регулярные выражения (то, с чем я в данный момент не знаком). Любой совет по подходу здесь будет принята с благодарностью.

Ожидаемый результат только заменяет точный текст 'method' на элемент содержимого, но сохраняет 'методы':

<section id="1">
   <title>Methods</title>
   <p>The test <content type="description" xlink:href="linktodescription">method</named-content> blah has 6 types of methods available</p>
</section>     
<section id="2">
  <title>Organisations</title>
  <p>The organisation has a <content type="description" xlink:href="linktodescription">method</named-content></p>
</section>

1 ответ

Решение

Предполагая Saxon 9 в качестве процессора XSLT, который вы можете использовать (на основе http://saxonica.com/html/documentation/xsl-elements/analyze-string.html)

<xsl:template match="section/p">
  <xsl:copy>
    <xsl:analyze-string select="." regex="\bmethod\b" flags=";j">
        <xsl:matching-substring>
            <content type="description" xlink:href="linktodescription">
                <xsl:value-of select="."/>
            </content>
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="."/>
        </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:copy>
</xsl:template>
Другие вопросы по тегам