Начните с шаблона идентификации .Из-за деталей определения приоритетов шаблона его следует поместить перед вторым шаблоном (см. Ниже).
Тогда ваш скрипт должен содержать шаблон, соответствующий text () узлам, включая xsl:анализировать строка .Атрибут regex должен содержать обе «нужные» строки в качестве групп захвата с пробелом между ними.
Внутри должно быть:
- xsl: match-подстрока печать:
- группа 1 (захвачена с помощью регулярного выражения),
- элемент (или все, что вы хотите здесь),
- группа 2.
- xsl: не совпадающая подстрока , просто репликациянесоответствующий текст.
Обратите внимание, что вторая "требуемая" строка содержит круглые скобки, которые являются специальными символами регулярных выражений, поэтому для их обработки буквально их следует экранировать с помощью \
.
Таким образом, весь сценарий может выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:analyze-string select="." regex="(Command K) (\(ever publish\))">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<t/>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
Обратите внимание, что я добавил <xsl:strip-space elements="*"/>
для фильтрации ненужных пробелов.