Сопоставление двух записей с одним и тем же узлом, где одна является итерацией дочерней записи другой

Я хочу создать итерацию узла к узлу в исходной схеме. Это достаточно просто, но проблема возникает, когда я хочу создать разные итерации на одном и том же узле на основе дочернего элемента первого узла.

<cases>
    <customer>
        <account>
        <name>John Smith</name>
        <address>hello road 321</address>
        <current_balance>100</current_balance>
        <current_balance_date>20180712</current_balance_date>
        </account>
        <invoices>
             <invoice>
                <amount>231</amount>
                <paydate>20183104</paydate>
             </invoice>
             <invoice>
                <amount>2332</amount>
                <paydate>20181204</paydate>
             </invoice>
         </invoices>
     </customer>    
</cases>

Для каждого клиента может быть один current_balance, но несколько счетов, и мне нужно сопоставить их с одним и тем же узлом в целевой схеме, и это должно выглядеть так:

<basis>
    <toPay>100</toPay>
    <dateToPay>20180712</dateToPay>
</basis>
<basis>
    <toPay>231</toPay>
    <dateToPay>20183104</dateToPay>
</basis>
<basis>
    <toPay>2332</toPay>
    <dateToPay>20181204</dateToPay>
</basis>

Я пробовал цикл таблицы, обычный цикл, условный цикл и создал xslt (с которым я также очень неопытен) и, похоже, не могу заставить его работать. Я могу сделать только один из каждого или два из каждого.

Изменить: в настоящее время я пытаюсь использовать xslt-inline-call:

<xsl:template name="basis">

<!-- balance-parameters -->
<xsl:param name="current_balance" />
<xsl:param name="current_balance_date" />

<!-- invoice-parameters -->
<xsl:param name="amount" />
<xsl:param name="paydate" />

<xsl:element name="basis">
    <xsl:element name="toPay"><xsl:value-of select="$current_balance" /></xsl:element>
    <xsl:element name="dateToPay"><xsl:value-of select="$current_balance_date" /></xsl:element>
</xsl:element>

<xsl:for-each select="cases/customer/account/invoices/invoice">
    <xsl:element name="basis">
        <xsl:element name="toPay"><xsl:value-of select="$amount" /></xsl:element>
        <xsl:element name="dateToPay"><xsl:value-of select="$paydate" /></xsl:element>
    </xsl:element>
</xsl:for-each>

</xsl:template>

for-each вообще ничего не выводит, я пробовал как case/customer/invoices/invoice, так и case/customer/invoices. Я просто не могу заставить эту работу вообще


person SJBilly    schedule 24.07.2018    source источник
comment
Итак, вы хотите ‹основу› для ‹current_balance› + количество элементов ‹invoice›?   -  person Johns-305    schedule 24.07.2018
comment
Я хочу создать «основу» для «текущего_баланса» и «основу» для всех счетов-фактур. Извините, если это было неясно, я отредактирую.   -  person SJBilly    schedule 24.07.2018


Ответы (2)


Этот должен работать. Вы должны зациклить /cases/customer/account/invoices/invoice not case/customer/invoices/invoice

<xsl:template name="basis"> 
<basis>
    <toPay>
        <xsl:value-of select="/cases/customer/account/current_balance" />
    </toPay>
    <dateToPay>
        <xsl:value-of select="/cases/customer/account/current_balance_date" />
    </dateToPay>
</basis>

<xsl:for-each select="/cases/customer/account/invoices/invoice">
    <basis>
        <toPay>
            <xsl:value-of select="amount" />
        </toPay>
        <dateToPay>
            <xsl:value-of select="paydate" />
        </dateToPay>
    </basis>
</xsl:for-each></xsl:template>

введите здесь описание изображения

person Ed Bangga    schedule 25.07.2018
comment
Я должен извиниться, то, что вы предлагаете, - это то, с чем я сейчас работаю, и это тоже не работает. - person SJBilly; 25.07.2018
comment
Привет SJBilly, добавил изображение для справки. Тестовая карта показывает правильные результаты - person Ed Bangga; 25.07.2018
comment
Хорошо, это технически отвечает на вопрос, поэтому я отмечу его ответом, но это не работает для меня. Учетная запись является родственной для счетов-фактур, а не родительской (опять же, извиняюсь), но я попытаюсь решить эту проблему в постпроцессоре, где я удаляю две ненужные мне основы после того, как пройдусь по ним обоим. Большое спасибо за вашу помощь и время! - person SJBilly; 25.07.2018

Во-первых, убедитесь, что исходная схема имеет основу и установлена ​​как maxOccurs = unbounded.

Это на самом деле очень просто. current_balance должен работать только со ссылками.

Вам понадобится Looping Functoid, связывающий счет-фактуру и базу, и еще один Looping Functoid, связывающий current_balance и base.

Это должно создать два для каждого в xsl, которые вы можете просмотреть с помощью Validate Map.

person Johns-305    schedule 24.07.2018
comment
Сначала я пытался использовать ссылки и циклы. Он выводит узлы баланса столько раз, сколько появилось счетов, хотя это должно произойти только один раз. - person SJBilly; 24.07.2018
comment
Должен ли я отказаться от использования xslt и использовать только ссылки? как со ссылками, так и с xslt создается по два каждого, но мне нужен только один ‹current_balance› - person SJBilly; 24.07.2018