Замена конкретной строки с помощью xsl

#xslt

#xslt

Вопрос:

У меня есть блок, как показано ниже.

 <rightOperand>.*ifIndedx.*</rightOperand>
  

Но мне нужно изменить приведенный выше фрагмент на приведенный ниже

 <rightOperand>(?i)(?s).*ifIndex.*</rightOperand>
  

Этот перевод необходимо выполнять только тогда, когда правильный операнд начинается и заканчивается строкой .*

пожалуйста, дайте мне несколько советов.

Ответ №1:

Вы можете сделать это, переопределив преобразование идентификатора с помощью дополнительного шаблона, просто чтобы соответствовать тексту в rightOperand, который соответствует вашим критериям

 <xsl:template match="rightOperand/text()
 [starts-with(., '.*')]
 [substring(., string-length(.) - 1, 2) = '.*']">
  

Обратите внимание, что XSLT 1.0 не имеет функции ends-with , поэтому требуется дополнительная работа по проверке окончания подстроки. Если бы вы использовали XSLT 2.0, вы могли бы упростить это с помощью ends_with.

Вот полный XSLT

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="rightOperand/text()
   [starts-with(., '.*')]
   [substring(., string-length(.) - 1, 2) = '.*']">
      <xsl:text>(?i)(?s)</xsl:text><xsl:copy />
   </xsl:template>

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

При применении к вашему образцу XML выводится следующее:

 <rightOperand>(?i)(?s).*ifIndedx.*</rightOperand>