2016-07-11 4 views
0

Будучи относительно неопытным в 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

Измените теги, чтобы указать, используете ли вы XSLT 1 или 2.0? Кроме того, что вы написали до сих пор? –

+0

У вас есть вопросы? – JLRishe

+0

Основная идея состоит в том, чтобы разбить атрибуты 'value' на свои компоненты и использовать« call-template »с результирующими результирующими значениями. –

ответ

1

Все, что вам нужно сделать, это взять шаблон tokenizing из your previous question и адаптировать его использовать два текста параметров вместо одного:

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> 
+0

Большое спасибо! Моя проблема была в логике второго шаблона. Я не передал правильные параметры. – user1747980

Смежные вопросы