Вот полное решение :
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"name/text()[contains(., ' -')]">
<xsl:value-of select="substring-before(., ' -')"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется к документу XML ниже :
<productroot>
<name>Proper name1 - Irrelevant 1</name>
<name>Proper name2 - Irrelevant 2</name>
<name>Proper name3 - Irrelevant 3</name>
<name>Proper name4 - Irrelevant 4</name>
<name>Proper name5 - Irrelevant 5</name>
</productroot>
желаемый, правильный результат получается :
<productroot>
<name>Proper name1</name>
<name>Proper name2</name>
<name>Proper name3</name>
<name>Proper name4</name>
<name>Proper name5</name>
</productroot>
Объяснение :
Переопределение правило идентификации .
Использование стандартных функций XPath contains()
и substring-before()
.