XSLT новичок (спасибо заранее)XSLT 2.0, шаблоны и соответствующие
У меня есть файл XML, содержащий данные о платеже. Я пытаюсь преобразовать его в XML-формат, используемый банком. XML должен отличаться в зависимости от типа платежа (срочный платеж/провод, стандартный платеж/ETF или ручной платеж). В данном файле возможны несколько платежей. Вот пример исходного XML (упрощенный, две сделки, как тот же самый тип оплаты)
<Payments>
<Payment xmlns:ns="urn:com.bank/paymentconnector">
<Payment_Detail>
<Payment_Info>
<ns:PAYMENT_Payment_Memo>Payment Info1</ns:PAYMENT_Payment_Memo>
<ns:PAYMENT_Payment_Amount>1111</ns:PAYMENT_Payment_Amount>
<ns:PAYMENT_Type>Wire</ns:PAYMENT_Type>
<ns:PAYMENT_Currency_Code>USD</ns:PAYMENT_Currency_Code>
<ns:PAYMENT_Check_or_Advice_Number>0</ns:PAYMENT_Check_or_Advice_Number>
</Payment_Info>
<Payer_Data>
<ns:PAYER_Company_Name>Company, LLP</ns:PAYER_Company_Name>
<ns:PAYER_Address_Line_1>Main st</ns:PAYER_Address_Line_1>
<ns:PAYER_Address_Line_2>Line 2</ns:PAYER_Address_Line_2>
<ns:PAYER_City>Cleveland</ns:PAYER_City>
<ns:PAYER_Zip_Code>11111</ns:PAYER_Zip_Code>
<ns:PAYER_Country>US</ns:PAYER_Country>
<ns:PAYER_Account_Number>1111-11111111</ns:PAYER_Account_Number>
<ns:PAYER_Currency>USD</ns:PAYER_Currency>
</Payer_Data>
<Payee_Data>
<ns:PAYEE_Name>Name</ns:PAYEE_Name>
<ns:PAYEE_Bank_Name>Bank Name</ns:PAYEE_Bank_Name>
<ns:PAYEE_Bank_Account_Name>Account Name</ns:PAYEE_Bank_Account_Name>
<ns:PAYEE_Account_Number>1111111</ns:PAYEE_Account_Number>
<ns:PAYEE_Masked_Account_Number>********** </ns:PAYEE_Masked_Account_Number>
<ns:PAYEE_Account_Type>DD</ns:PAYEE_Account_Type>
<ns:PAYEE_Routing_Transit_Number>22222</ns:PAYEE_Routing_Transit_Number>
<ns:PAYEE_Bank_Country>US</ns:PAYEE_Bank_Country>
</Payee_Data>
</Payment_Detail>
</Payment>
<Payment>
<Payment_Detail>
<Payment_Info>
<ns:PAYMENT_Payment_Memo>Payment Info2</ns:PAYMENT_Payment_Memo>
<ns:PAYMENT_Payment_Amount>22222</ns:PAYMENT_Payment_Amount>
<ns:PAYMENT_Type>Wire</ns:PAYMENT_Type>
<ns:PAYMENT_Currency_Code>USD</ns:PAYMENT_Currency_Code>
<ns:PAYMENT_Check_or_Advice_Number>0</ns:PAYMENT_Check_or_Advice_Number>
</Payment_Info>
<Payer_Data>
<ns:PAYER_Company_Name>Company, LLP</ns:PAYER_Company_Name>
<ns:PAYER_Address_Line_1>Main st</ns:PAYER_Address_Line_1>
<ns:PAYER_Address_Line_2>Line 2</ns:PAYER_Address_Line_2>
<ns:PAYER_City>Cleveland</ns:PAYER_City>
<ns:PAYER_Zip_Code>11111</ns:PAYER_Zip_Code>
<ns:PAYER_Country>US</ns:PAYER_Country>
<ns:PAYER_Account_Number>1111-11111111</ns:PAYER_Account_Number>
<ns:PAYER_Currency>USD</ns:PAYER_Currency>
</Payer_Data>
<Payee_Data>
<ns:PAYEE_Name>Name</ns:PAYEE_Name>
<ns:PAYEE_Bank_Name>Bank Name</ns:PAYEE_Bank_Name>
<ns:PAYEE_Bank_Account_Name>Account Name</ns:PAYEE_Bank_Account_Name>
<ns:PAYEE_Account_Number>1111111</ns:PAYEE_Account_Number>
<ns:PAYEE_Masked_Account_Number>**********</ns:PAYEE_Masked_Account_Number>
<ns:PAYEE_Account_Type>DD</ns:PAYEE_Account_Type>
<ns:PAYEE_Routing_Transit_Number>22222</ns:PAYEE_Routing_Transit_Number>
<ns:PAYEE_Bank_Country>US</ns:PAYEE_Bank_Country>
</Payee_Data>
</Payment_Detail>
</Payments>
Вот моя (упрощенный) выход
<?xml version="1.0" encoding="UTF-8"?>
<!-- urgent payment-->
<urgent_payment_header>
<header_fields/>
</urgent_payment_header>
<paymentrec>
<recordType>5</recordType>
<payerAccNum>1111-11111111</payerAccNum>
<!-- (other fields)-->
</paymentrec>
<paymentrec>
<recordType>5</recordType>
<payerAccNum></payerAccNum>
<!-- continue with any other urgent payments in the file-->
</paymentrec>
<urgent_control_fields>
</urgent_control_fields>
<!-- standard payment-->
<standard_payment_header>
<header_fields/>
</standard_payment_header>
<paymentrec>
<recordType>4</recordType>
<payerAccNum>1111-11111111</payerAccNum>
<!-- (other fields)-->
</paymentrec>
<paymentrec>
<recordType>4</recordType>
<payerAccNum></payerAccNum>
<!-- continue with any other standard payments in the file-->
</paymentrec>
<standard_control_fields>
</standard_control_fields>
<!-- catch all payments-->
<catchall_payment_header>
<header_fields/>
</catchall_payment_header>
<paymentrec>
<recordType>3</recordType>
<payerAccNum>1111-11111111</payerAccNum>
<!-- (other fields)-->
</paymentrec>
<paymentrec>
<recordType>3</recordType>
<payerAccNum></payerAccNum>
<!-- continue with any other catchall payments in the file-->
</paymentrec>
<catchall_control_fields>
</catchall_control_fields>
мой XSLT работает, когда все платежи в исходный файл является одним и тем же типом (все срочные, все стандартные, все другие типы) с одним заголовком, перечислены записи платежей, а затем одна контрольная запись
Однако, когда типы платежей смешиваются (например, один срочный и один стандарт), то только заголовок, первый узел и управление запись записывается на выход. Если файл содержит срочный платеж/провод и стандартный платеж, я хочу выход быть
вот мой (упрощенный XSLT)
<!-- Begin writing the output-->
<xsl:template match="Payments">
<xsl:choose>
<xsl:when test="Payment/Payment_Detail/Payment_Info[ns:PAYMENT_Type != 'Wire']">
<xsl:call-template select="Payment-Header"/>
<xsl:apply-templates select="Payment"/>
<xsl:call-templates select="Payment-Control-Standard"/>
</xsl:when>
<xsl:when test="Payment/Payment_Detail/Payment_Info[ns:PAYMENT_Type = 'Wire']">
<xsl:call-template select="Payment-Header"/>
<xsl:apply-templates select="Payment"/>
<xsl:call-template name="Payment-Control-Urgent"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Payment-Header"/>
<xsl:apply-templates select="Payment"/>
<xsl:call-template name="Payment-Control-CatchAll"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="Payment">
<xsl:choose>
<xsl:when test="Payment_Detail/Payment_Info[ns:PAYMENT_Type != 'Wire']">
<xsl:call-template name="Payment-Standard"/>
</xsl:when>
<xsl:when test="Payment_Detail/Payment_Info[ns:PAYMENT_Type = 'Wire']">
<xsl:call-template name="Payment-Urgent"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="Payment-CatchAll"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- End writing the output-->
<!-- Begin template details-->
<xsl:template name="Payment-Header">
<header>
(header fields, details not important)
</header>
</xsl:template>
<xsl:template name="Payment-Control-Standard">
<control>
<numberOfPayments>count of standard payments in the file</numberOfPayments>
<sumOfPayments>sum of standard payments in the file</sumOfPayments>
</control>
</xsl:template>
<xsl:template name="Payment-Control-Urgent">
<control>
<numberOfPayments>count of urgent payments in the file</numberOfPayments>
<sumOfPayments>sum of urgent payments in the file</sumOfPayments>
</control>
</xsl:template>
<xsl:template name="Payment-Control-CatchAll">
<control>
<numberOfPayments>count of catch all payments in the file</numberOfPayments>
<sumOfPayments>sum of catch all payments in the file</sumOfPayments>
</control>
</xsl:template>
<xsl:template name="Payment-Standard">
<paymentrec>
(payment fields, details not important)
</paymentrec>
</xsl:template>
<xsl:template name="Payment-Urgent">
<paymentrec>
(payment fields, details not important)
</paymentrec>
</xsl:template>
<xsl:template name="Payment-CatchAll">
<paymentrec>
(payment fields, details not important)
</paymentrec>
</xsl:template>
Код типа '' просто даст синтаксическую ошибку XSLT или XPath об этой непревзойденной закрывающей квадратной скобке ']'. –
Есть также многочисленные ошибки в исходном XML. ns: не определено, PAYMENT_Type закрыт PAYMENT_Currency во многих местах, у вас есть закрывающий тег wpc: PAYEE_Bank_Country для открытия тега ns: PAYEE_Bank_Country. Потратьте время, чтобы сначала опубликовать действительный XML, прежде чем просить нас попытаться исправить проблемы, поскольку сначала нам нужно исправить все эти ошибки. –
Извините. Я раскалывал фактический источник xml/xslt, чтобы попытаться упростить его понимание и сделать проблему хуже. (Отредактировано) – Jay