在XSLT中相对缺乏经验,我遇到了一个问题,需要XSLT专家的一些帮助。
以下产品类型及其相关代码在不同的分隔字符串中是1对1匹配。我需要从两个字符串的相同位置一次提取两个(参见下面的示例)。此外,分隔字符串中的产品类型和产品代码的数量可能会有所不同。
<OFFERINGS>
<PRODUCT>
<attribute name="PRODUCT_TYPES" value="GUL5, RIDER, LIR, WAIVER" />
<attribute name="PRODUCT_CODES" value="SLG3AA, R001, LIR3, PW0001" />
</PRODUCT>
<PRODUCT>
<attribute name="PRODUCT_TYPES" value="TERM8, WAIVER2" />
<attribute name="PRODUCT_CODES" value="SP0007, PW0002" />
</PRODUCT>
</OFFERINGS>
要
<COVERAGES>
<GROUP_COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>GUL5</PRODUCT_TYPE>
<PRODUCT_CODE>SLG3AA</PRODUCT_CODE>
</COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>RIDER</PRODUCT_TYPE>
<PRODUCT_CODE>R001</PRODUCT_CODE>
</COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>LIR</PRODUCT_TYPE>
<PRODUCT_CODE>LIR3</PRODUCT_CODE>
</COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>WAIVER</PRODUCT_TYPE>
<PRODUCT_CODE>PW0001</PRODUCT_CODE>
</COVERAGE>
</GROUP_COVERAGE>
<GROUP_COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>TERM8</PRODUCT_TYPE>
<PRODUCT_CODE>SP0007</PRODUCT_CODE>
</COVERAGE>
<COVERAGE>
<PRODUCT_TYPE>WAIVER2</PRODUCT_TYPE>
<PRODUCT_CODE>PW0002</PRODUCT_CODE>
</COVERAGE>
</GROUP_COVERAGE>
</COVERAGES>
答案 0 :(得分:1)
您需要做的就是从your previous question获取标记化模板,并使其适应使用两个 text 参数而不是一个:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/OFFERINGS">
<COVERAGES>
<xsl:apply-templates/>
</COVERAGES>
</xsl:template>
<xsl:template match="PRODUCT">
<COVERAGE>
<xsl:call-template name="tokenize">
<xsl:with-param name="types" select="attribute[@name='PRODUCT_TYPES']/@value"/>
<xsl:with-param name="codes" select="attribute[@name='PRODUCT_CODES']/@value"/>
</xsl:call-template>
</COVERAGE>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="types"/>
<xsl:param name="codes"/>
<xsl:param name="delimiter" select="', '"/>
<xsl:variable name="type" select="substring-before(concat($types, $delimiter), $delimiter)" />
<xsl:variable name="code" select="substring-before(concat($codes, $delimiter), $delimiter)" />
<xsl:if test="$type">
<COVERAGE>
<PRODUCT_TYPE>
<xsl:value-of select="$type"/>
</PRODUCT_TYPE>
<PRODUCT_CODE>
<xsl:value-of select="$code"/>
</PRODUCT_CODE>
</COVERAGE>
</xsl:if>
<xsl:if test="contains($types, $delimiter)">
<!-- recursive call -->
<xsl:call-template name="tokenize">
<xsl:with-param name="types" select="substring-after($types, $delimiter)"/>
<xsl:with-param name="codes" select="substring-after($codes, $delimiter)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>