У меня есть XML-файл, который описывает (среди прочего) элементы со значениями атрибутов, которые описывают полностью определенные имена классов Java. Я пытаюсь написать XSLT-преобразование, чтобы изменить имена классов, описанные в этом файле, чтобы (например) вхождения com.example.MyClass
стали com.example.MockMyClass
.
Вот снова этот пример в контексте фрагмента исходного файла:
<event type="node-enter">
<action name="MyActionName" class="com.example.MyClass">
<bodyTemplate>
templates/MyTemplate.vm
</bodyTemplate>
</action>
</event>
Я хочу, чтобы результат был:
<event type="node-enter">
<action name="MyActionName" class="com.example.MockMyClass">
<bodyTemplate>
templates/MyTemplate.vm
</bodyTemplate>
</action>
</event>
Я выполняю это преобразование, используя Java JAXP API, и написал прекрасную подпрограмму, поддерживающую XSLT 2.0, для получения желаемых результатов, но обнаружил, что Java 5 не поддерживает XSLT 2.0, который требуется для регулярных выражений поддержка.
Итак, мой вопрос: как лучше всего добиться этого, используя архаичный API JAXP XSLT 1.0? То есть без использования регулярных выражений. Я искал похожие проблемы, но требование к группам регулярных выражений с обратными ссылками, кажется, делает это сложным. Этот вопрос является началом, но мне нужно вставить текст в соответствующую строку, а не просто , заменив .
Для справки, вот моя попытка регулярного выражения (XSLT 2.0):
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<xsl:analyze-string select='action/@class' regex='([A-Za-z0-9]+[$\.])+([A-Za-z0-9]+)'>
<xsl:matching-substring>
<xsl:value-of select='regex-group(1)'/>
<xsl:text>Mock</xsl:text>
<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>