2015-08-11 2 views
0

XSLT новичка (так что я извиняюсь заранее)XSLT 2.0, шаблоны и узел/значение устанавливают

У меня есть файл XML, содержащий данные платежа. Я пытаюсь преобразовать его в XML-формат, используемый банком. XML должен быть другим, если это не долларовый платеж против платежа в долларах США. Множественные платежи возможны в данном файле здесь приведен пример исходного XML (упрощенный, одна операция)

<Payments> 
<Payment> 
    <Payment_Detail> 
    <Payment_Info> 
     <ns:PAYMENT_Payment_Memo>Payment Info</ns:PAYMENT_Payment_Memo> 
     <ns:PAYMENT_Payment_Amount>22222</ns:PAYMENT_Payment_Amount> 
     <ns:PAYMENT_Currency>US Dollars</ns:PAYMENT_Currency> 
     <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</wpc:PAYEE_Bank_Country> 
    </Payee_Data> 
    </Payment_Detail> 
</Payment> 
</Payments> 

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

вот мой XSL (также упрощена)

<xsl:variable name="paymentCurrency" 
    select="/Payment/Payment_Detail/Payment_Info/ns:PAYMENT_Currency_Code"/> 


     <xsl:choose> 
      <xsl:when test="$paymentCurrency = 'USD'"> 

        <xsl:call-template name="Payment-Domestic"/> 

      </xsl:when>  
      <xsl:otherwise> 

       <xsl:call-template name="Payment-Foreign"/> 

      </xsl:otherwise> 

     </xsl:choose> 


     <xsl:template name="Payment-Domestic"> 
      <xsl:for-each select="/Payments/Payment"> 
       <paymentrec> 
        <recordType>2</recordType> 
        <!-- insert other domestic payment fields --> 
      </xsl:for-each> 
     </xsl:template> 

     <xsl:template name="Payment-Foreign"> 
      <xsl:for-each select="/Payments/Payment"> 
       <paymentrec> 
        <recordType>5</recordType> 
        <!-- insert other non US payment fields --> 
      </xsl:for-each> 
     </xsl:template> 

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

Каков наилучший способ для вызова различных шаблонов? Не следует ли использовать для каждого? (Обработки XSLT, как императивный язык не самая умная идея либо, я знаю)

Благодаря


EDIT, чтобы ответить на комментарий/вопрос XSLT 2.0, пример вывод (упрощенно ниже)

(Foreign платеж)

<paymentrec> 
    <recordType>5</recordType> 
    <payerAccNum>1111-11111111</payerAccNum> 
    <Currency/> 
    (other fields) 
</paymentrec> 

(USD платеж)

<paymentrec> 
    <recordType>2</recordType> 
    <payerAccNum>1111-11111111</payerAccNum> 
    <payAmount/> 
    (other fields) 
</paymentrec> 

Это также приводит меня к другому вопросу: Если у меня есть 3-4 поля для добавления в качестве внутренних платежей (но не иностранных). У меня есть шаблон внутренней оплаты, но если я его назову внутри внутреннего шаблона, он дублирует заголовок. Если я применяю его, когда я называю «платеж» шаблон он появляется в иностранной оплаты (который я не хочу)

ответ

0

Я хотел бы использовать несколько шаблонных правил, как это:

<xsl:template match="Payment[Payment_Detail/Payment_Info/ns:PAYMENT_Currency_Code='USD']"> 
    <usa> 
    ... 
    </usa> 
</xsl:template> 

<xsl:template match="Payment"> 
    <restOfTheWorld> 
    ... 
    </restOfTheWorld> 
</xsl:template> 

Нет необходимость в дополнительном шаблоне «маршрутизации», используемом шаблонами соответствия @thrig, позволяет работать бесплатно.

Ваш код с помощью

<xsl:variable name="paymentCurrency" select="/Payment/Payment_Detail/Payment_Info/ns:PAYMENT_Currency_Code"/> 

неправильно, потому что выражения пути, начинающиеся с «/» выберите относительно корня документа, а не по отношению к оплате вы в настоящее время обработки.

(И в то время как мы находимся на предмете относительного по сравнению с абсолютным, я избегал терминов «внутренний» и «чужой», потому что вы хотите, чтобы ваш код имеет смысл для людей за пределами США.)

+0

Спасибо! и банк использует термины «иностранные» и «домашние» ... и у них есть некоторые действительно странные требования, в которые я не буду входить – Jay

0
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://example.edu/" version="1.0"> 
    /* start at the root node... */ 
    <xsl:template match="/Payments"> 
    <root> 
     <xsl:apply-templates select="Payment"/> 
    </root> 
    </xsl:template> 

    /* then for each "Payment" figure out what it is, call appropriate template */ 
    <xsl:template match="Payment"> 
    <xsl:choose> 
     <xsl:when test="Payment_Detail/Payment_Info/ns:PAYMENT_Currency_Code='USD'"> 
     <xsl:call-template name="domestic"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:call-template name="foreign"/> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

    /* note that these are "rooted" relative to the Payment element */ 
    <xsl:template name="domestic"> 
    <domestic> 
    <xsl:value-of select="Payment_Detail/Payment_Info/PAYMENT_Payment_Amount"/> 
    </domestic> 
    </xsl:template> 

    <xsl:template name="foreign"> 
    <TODO> 
     <foreign/> 
    </TODO> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо! это сделал трюк! – Jay

+0

Один последний (родственный) вопрос). Если у меня есть 3-4 поля для добавления в качестве заголовка для внутренних платежей (но не для иностранных).У меня есть шаблон внутренней оплаты, но если я его назову внутри внутреннего шаблона, он дублирует заголовок. Если я применяю его, когда я вызываю шаблон оплаты, он появляется в иностранной платежной системе (чего я не хочу) – Jay

+0

Нечеткий для меня без ввода образца и ожидаемого результата; например что произойдет, если есть платежи смешанного региона? – thrig

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