ここにそれを行う1つの方法があります。あなたの例を考えると、「h」を含む要素には「s」も決して含まれないと仮定しました。
この XSLT スタイルシート:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" indent="yes" omit-xml-declaration="yes"/>
<!-- The identity transform. -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<!-- Match MediaInfoDuration elements containing 'h'. -->
<xsl:template match="MediaInfoDuration[contains(., 'h')]">
<Duration>
<xsl:call-template name="hh-mm-ss">
<xsl:with-param name="hours" select="substring-before(., 'h')" />
<xsl:with-param name="minutes" select="substring-before(substring-after(., 'h '), 'mn')"/>
</xsl:call-template>
</Duration>
</xsl:template>
<!-- Match the other kind of MediaInfoDuration element. -->
<xsl:template match="MediaInfoDuration">
<Duration>
<xsl:call-template name="hh-mm-ss">
<xsl:with-param name="minutes" select="substring-before(., 'mn')" />
<xsl:with-param name="seconds" select="substring-before(substring-after(., 'mn '), 's')"/>
</xsl:call-template>
</Duration>
</xsl:template>
<!-- Formatting the output. -->
<xsl:template name="hh-mm-ss">
<xsl:param name="hours" select=" '0' "/>
<xsl:param name="minutes" select=" '0' " />
<xsl:param name="seconds" select=" '0' "/>
<xsl:value-of select="format-number($hours, '00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number($minutes, '00')"/>
<xsl:text>:</xsl:text>
<xsl:value-of select="format-number($seconds, '00')"/>
</xsl:template>
</xsl:stylesheet>
この入力 XML に適用すると、次のようになります。
<root>
<MediaInfoDuration>56mn 48s</MediaInfoDuration>
<MediaInfoDuration>1h 58mn</MediaInfoDuration>
</root>
次の出力が生成されます。
<root>
<Duration>00:56:48</Duration>
<Duration>01:58:00</Duration>
</root>