Вы можете сделать это с помощью функции XSLT-2.0 analyze-string
.
Таким образом, следующий код XSLT может сделать эту работу:
Входной XML:
<root>
<str>++0049134-343-285</str>
<str>+00421335-645-784</str>
<str>49134543-346-283</str>
<str>++0042134-347-282</str>
<str>++0041134-349-282</str>
</root>
Обработка файла XSLT-2.0:
<?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" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/root/str">
<xsl:analyze-string select="text()" regex="\+(\+.*)">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/><xsl:text>
</xsl:text>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
Вывод:
+0049134-343-285
+0042134-347-282
+0041134-349-282
Другая комбинация шаблонов может быть следующей с использованием функции matches
:
<xsl:template match="text()" />
<xsl:template match="str[matches(text(),'^\+\+[^+]+')]">
<xsl:value-of select="substring-after(text(),'+')"/><xsl:text>
</xsl:text>
</xsl:template>
Это выражение является еще более точным, поскольку оно исключает строки с тремя +
или более в начале строки.
Я надеюсь, что этого достаточно для ваших нужд.