Замена конкретной строки с помощью xsl - PullRequest
0 голосов
/ 27 октября 2011

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

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

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

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

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

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

1 Ответ

1 голос
/ 27 октября 2011

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

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

Обратите внимание, что XSLT 1.0 не имеет функции оканчивается на , поэтому существует дополнительная работа для проверки окончания с подстрокой . Если бы вы использовали XSLT 2.0, вы могли бы упростить это с помощью end_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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...