Есть ли выражение, которое будет возвращать всех братьев и сестер для родительского узла в xslt - PullRequest
1 голос
/ 06 января 2020

Для каждого раздела 'paymentSummaries' будет создана новая таблица, и я смог заставить ее работать. Что не работает, так это получение paymentSummary / splitCode / (number) (type) (policyDetails) (amountPaid) для отображения (возврата) не только первого экземпляра в каждой таблице.

Вот мой XML:

<paymentSummaries>
    <billingAccountNumber>billingAccountNumber1</billingAccountNumber>
    <paymentSummary>
      <splitCode>
        <number>paymentSummary1</number>
        <type>type1</type>
        <policyDetails>policyDetails1</policyDetails>
        <amountPaid>amountPaid1</amountPaid>
      </splitCode>
    </paymentSummary>
    <paymentSummary>
      <splitCode>
        <number>paymentSummary2</number>
        <type>type2</type>
        <policyDetails>policyDetails2</policyDetails>
        <amountPaid>amountPaid2</amountPaid>
      </splitCode>
    </paymentSummary>
    <serviceFee>serviceFee1</serviceFee>
    <totalAmountPaid>totalAmountPaid1</totalAmountPaid>
</paymentSummaries>

Это то, что я пробовал до сих пор. Первый пример возвращает только первый экземпляр. Второй пример ничего не возвращает / пусто.

1-й пример:

У меня есть <xsl:for-each select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']"> обтекание всей таблицы (это заставляет его повторять таблицу для каждого прошло.

Для отдельных дочерних и родственных элементов я не указал ни одного теста <for-each> или <if>, потому что думал, что он просто повторяет экземпляры.

2-й пример:

<table border="0" cellpadding="0" cellspacing="0">
<tr>
    <xsl:if test="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='number'] != ''">
<td align="left" valign="top" style="padding: 8px 5px 0px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="170" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
<xsl:value-of select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='number']"></xsl:value-of>
</div>
</td>
<td width="270" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
<xsl:value-of select="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='type']"></xsl:value-of>
</div>
</td>
</tr>
</table>
</td>
<td width="95" align="right" valign="top" class="width150" style="padding: 8px 5px 0px 10px;">
<div class="FS13 LH18" style="font-size:14px; line-height:20px; color:#313131; font-weight:normal;font-family: Arial Narrow, Arial, Helvetica, sans-serif;">
       <xsl:value-of select="*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='amountPaid']"</xsl:value-of>
</div>
</td>
</xsl:if>
</tr>
           <xsl:for-each select="*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][position() >1]">
<tr>
<td align="left" valign="top" style="padding: 8px 5px 0px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="170" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
            <xsl:value-of select="*[local-name()='number']"></xsl:value-of>
</div>
</td>
<td width="270" height="25" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
           <xsl:value-of select="*[local-name()='type']"></xsl:value-of>
</div>
</td>
</tr>
</table>
</td>
<td width="95" align="right" valign="top" class="width150" style="padding: 8px 5px 0px 10px;">
<div class="FS13 LH18" style="font-size:14px; line-height:20px; color:#313131; font-weight:normal;font-family: Arial Narrow, Arial, Helvetica, sans-serif;">
          <xsl:value-of select="*[local-name()='amountPaid']"></xsl:value-of>
</div>
</td>
</tr>
</xsl:for-each>
<tr bgcolor="#ffffff">
          <xsl:if test="SFF/*[local-name()='paymentReceipt']/*[local-name()='paymentSummaries']/*[local-name()='paymentSummary']/*[local-name()='splitCode'][1]/*[local-name()='policyDetails'] != ''">
<td align="left" valign="top" style="padding: 0px 5px 8px 10px;">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="175" align="left" valign="top" class="fl wrap width150">
    <div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
            </div>
    </td>
<td width="270" align="left" valign="top" class="fl wrap width150">
<div class="FS13 LH18" style="font-family: Arial Narrow, Arial, Helvetica, sans-serif;font-size:14px; line-height:20px; color:#313131; font-weight:normal;">
    <xsl:value-of select="*[local-name()='splitCode'][1]/*[local-name()='policyDetails']" />
      </div>
          </td>
         </tr>
        </table>
      </td>
    </xsl:if>
 </tr>
<table>

Это то, что я получаю Таблица 1: paymentSummary1 type1 amountPaid1 policyDetails1 (в этой таблице отсутствует paymentSummary2, type2, et c.)

Таблица 2: paymentSummary3 type3 amountPaid3 (в этой таблице отсутствует paymentSummary4, type4, et c. policyDetails3

Есть идеи, как заставить это работать должным образом?

1 Ответ

0 голосов
/ 09 января 2020

Мне кажется, я вижу, что вы пытаетесь сделать: поместите все сводные данные о платежах в таблицу, за которой следует единый policyDetail

Вы начинаете с того, что для каждого раздела 'paymentSummaries' создается новый таблица будет создана ... "

Итак, вы хотите начать с этого:

<xsl:template select='/'>
    <xsl:for-each select='//paymentSummaries'>
        <table>
            <xsl:apply-templates select='paymentSummary'/>
            <xsl:call-template name='policy'/>
        </table>
    </xsl:for-each>
</xsl:template>

рядом с вами, чтобы решить, что вы собираетесь делать для каждого из блоков paymentSummary. Здесь я просто добавляю новую строку в таблицу

<xsl:template match='paymentSummary'>
    <tr>
        <td>
            <xsl:value-of select='splitCode/number'/>
        </td>
        <td>
            <xsl:value-of select='splitCode/type'/>
        </td>
        <td>
            <xsl:value-of select='splitCode/amountPaid'/>
        </td>
    </tr>
</xsl:template>

Наконец, я добавляю часть политики: запишите шаблон вызова вместо apply-template, поскольку я хочу сделать это только один раз.

<xsl:template name='policy'>
    <tr>
        <td>
            <xsl:value-of select='paymentSummary[1]/splitCode/policyDetails'/>
        </td>
    </tr>
</xsl:template>

Как только у вас будет общий макет того, что вы хотите, go вперед и добавьте свой собственный стиль

...