#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>