定界字符串匹配模式

时间:2016-07-11 05:28:17

标签: xml xslt

在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>

1 个答案:

答案 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>