Я экспериментирую с XSLT2, использую таблицу стилей на основе этого ответа:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="source/text()">
<xsl:sequence select="replace(., '<.*?>', '<ph>$0</ph>')"/>
</xsl:template>
</xsl:stylesheet>
, который предназначен для многократной замены, например, из:
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file>
<source>abc <field1> def <field2> ghi</source>
</file>
</xliff>
до:
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns:xliff="urn:oasis:names:tc:xliff:document:1.1" version="1.1">
<file>
<source>abc <ph><field1></ph> def <ph><field2></ph> ghi</source>
</file>
</xliff>
Однако мое преобразование недопустимо, я получаю эту ошибку:
Error on line 12 column 54 of my.xsl:
SXXP0003: Error reported by XML parser: The value of attribute "select" associated with an
element type "null" must not contain the '<' character.
Если я использую select="replace(., '<(.*?)>', '<ph>F</phgt;')"
, тогда я получаю ...<ph>...
на выходе.
Если я использую DOE , я создаю другие проблемы, потому что могут быть другие объекты в поле, которые я хочу оставить нетронутыми Если я использую <xsl:output method="text"/>
, я теряю большую часть своего xml - есть ли другой способ «смешивания и сопоставления», подобный этому?