Это общее преобразование, которое позволяет обрабатывать строку, содержащую неопределенное количество пар имя-значение :
<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="/">
<xsl:variable name="vStyle" select="/*/*/title/@style"/>
The value for 'abc' is : <xsl:text/>
<xsl:call-template name="getValueOfName">
<xsl:with-param name="pText" select="$vStyle"/>
<xsl:with-param name="pName" select="'abc'"/>
</xsl:call-template>
The value for 'cdf' is : <xsl:text/>
<xsl:call-template name="getValueOfName">
<xsl:with-param name="pText" select="$vStyle"/>
<xsl:with-param name="pName" select="'cdf'"/>
</xsl:call-template>
The value for 'xyz' is : <xsl:text/>
<xsl:call-template name="getValueOfName">
<xsl:with-param name="pText" select="$vStyle"/>
<xsl:with-param name="pName" select="'xyz'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="getValueOfName">
<xsl:param name="pText"/>
<xsl:param name="pName"/>
<xsl:choose>
<xsl:when test="not(string-length($pText) > 0)"
>***Not Found***</xsl:when>
<xsl:otherwise>
<xsl:variable name="vPair" select=
"substring-before(concat($pText, ';'), ';')"/>
<xsl:choose>
<xsl:when test=
"$pName = substring-before(concat($vPair, ':'), ':')">
<xsl:value-of select="substring-after($vPair, ':')"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="getValueOfName">
<xsl:with-param name="pText" select=
"substring-after($pText, ';')"/>
<xsl:with-param name="pName" select="$pName"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<catalog>
<cd>
<title style="abc:true;cdf:false" att2="false">Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
дает желаемый результат :
The value for 'abc' is : true
The value for 'cdf' is : false
The value for 'xyz' is : ***Not Found***
Объяснение
Шаблон getValueOfName
является универсальным шаблоном, который находит пару имя-значение, содержащее указанное pName
, а затем выводит значение - или, если это имя вообще не найдено, выводится строка ***Not Found***
.
Шаблон сначала получает первую строку имя-значение из строки и обрабатывает ее. Если pName
отсутствует в текущей паре имя-значение, то шаблон рекурсивно вызывает себя для текста, следующего за текущей парой имя-значение.