Это преобразование XSLT 1.0 правильно обрабатывает даже документы, в которых <heading>
содержит произвольные не алфавитно-цифровые символы :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="vDigits" select=
"'0123456789'"/>
<xsl:variable name="vAlhpaNum" select=
"concat($vUpper, $vLower, $vDigits)"/>
<xsl:template match=
"node()[not(self::heading or self::text)]|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="heading">
<xsl:element name=
"{translate(translate(.,translate(.,$vAlhpaNum,''),''),
$vUpper,
$vLower
)
}">
<xsl:value-of select="following-sibling::text[1]"/>
</xsl:element>
</xsl:template>
<xsl:template match="text"/>
</xsl:stylesheet>
При применении к следующему документу XML (на основе предоставленного, но сделанного более сложным):
<finding>
<title>Found something</title>
<heading>Severity...</heading>
<text>Really low.</text>
<heading>URL?</heading>
<text>https://www.something.com:443</text>
<heading>Description:</heading>
<text>We have found an issue</text>
<heading>Impact!:</heading>
<text>This is bad.</text>
<heading>Recommendations!!!</heading>
<text>Fix it!.</text>
</finding>
желаемый, правильный результат получен :
<finding>
<title>Found something</title>
<severity>Really low.</severity>
<url>https://www.something.com:443</url>
<description>We have found an issue</description>
<impact>This is bad.</impact>
<recommendations>Fix it!.</recommendations>
</finding>