2013-02-20 49 views
1

我正在解析要轉換爲文本並提交給FinCEN的XML,該FinCEN需要它以非常特定的格式。基本上,我會得到一個xml文件,其中所有的元素都是兄弟姐妹排列的,並且它們之間的關聯是基於文件中的外觀順序。所以我可以有一個看起來像這樣的文件:關於複雜XSLT的指導

<bsar:BSAForm xmlns:bsar="http://www.fincen.gov/bsa/bsar/2011-06-01"> 
<bsar:FilingInstitutionInformation> 
    <bsar:PrimaryRegulator>D</bsar:PrimaryRegulator> 
    <bsar:FilerName>New Banking Corp.</bsar:FilerName> 
    <bsar:TIN>373637383</bsar:TIN> 
    <bsar:TINTYPE>A</bsar:TINTYPE> 
    <bsar:FIType> 
     <ucc:FinInsType xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">C</ucc:FinInsType> 
     <ucc:OtherSpecify xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01" /> 
    </bsar:FIType> 
    <bsar:SecuritiesFuturesType> 
     <bsar:ClearingBrokerSecurities /> 
     <bsar:CPOCTA /> 
     <bsar:FuturesCommissionMerchant /> 
     <bsar:HoldingCompany /> 
     <bsar:IntroducingCommodities /> 
     <bsar:IntroducingSecurities /> 
     <bsar:InvestmentAdvisor /> 
     <bsar:InvestmentCompany /> 
     <bsar:RetailForeign /> 
     <bsar:SROFutures /> 
     <bsar:SROSecurities /> 
     <bsar:Subsidiary /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:SecuritiesFuturesType> 
    <bsar:FIIdentification> 
     <ucc:FIIDType xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">D</ucc:FIIDType> 
     <ucc:FIIDNumber xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">654646321321</ucc:FIIDNumber> 
    </bsar:FIIdentification> 
    <bsar:FIAddress> 
     <ucc:Address xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">Ave X</ucc:Address> 
     <ucc:City xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">Brooklyn</ucc:City> 
     <ucc:State xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">NY</ucc:State> 
     <ucc:ZIP xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">11235</ucc:ZIP> 
     <ucc:Country xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01">US</ucc:Country> 
    </bsar:FIAddress> 
    <bsar:AlternateName>alternate name</bsar:AlternateName> 
</bsar:FilingInstitutionInformation> <!--2A--> 

<bsar:FinancialInstitutionInformation> 
    <bsar:LegalName>Citibank</bsar:LegalName> 
</bsar:FinancialInstitutionInformation> <!--2B--> 
<bsar:SuspiciousActivityInformation> 
    <bsar:FilingType>A</bsar:FilingType> 
    <bsar:ContinuingActivity /> 
    <bsar:JointReport /> 
    <ucc:DocumentControlNumber xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01" /> 
    <bsar:ViolationAmount /> 
    <bsar:AmountUnKnownOrNotInvolved>B</bsar:AmountUnKnownOrNotInvolved> 
    <bsar:FromSuspiciousActivityDate>12312012</bsar:FromSuspiciousActivityDate> 
    <bsar:ToSuspiciousActivityDate>12312012</bsar:ToSuspiciousActivityDate> 
    <bsar:CumulativeAmount /> 
    <bsar:Structuring> 
     <bsar:AltersTransactionBSA>A</bsar:AltersTransactionBSA> 
     <bsar:AltersTransactionCTR /> 
     <bsar:CustomerCancels /> 
     <bsar:MultipleTransactions /> 
     <bsar:MultipleTransactionsCTR /> 
     <bsar:SuspiciousInquiry /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Structuring> 
    <bsar:TerroristFinanacing> 
     <bsar:KnownTerroristOrg /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:TerroristFinanacing> 
    <bsar:Fraud> 
     <bsar:ACH /> 
     <bsar:BusinessLoan /> 
     <bsar:Check /> 
     <bsar:ConsumerLoan /> 
     <bsar:CreditDebitCard /> 
     <bsar:HealthCare /> 
     <bsar:Mail /> 
     <bsar:MassMarketing /> 
     <bsar:PyramidScheme /> 
     <bsar:Wire /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Fraud> 
    <bsar:Casinos> 
     <bsar:InquiryOnEOB /> 
     <bsar:MinimalGaming /> 
     <bsar:IntraCasinoFundTransfer /> 
     <bsar:CounterChecksorMarkers /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Casinos> 
    <bsar:MoneyLaundering> 
     <bsar:ExchangeSmallBig /> 
     <bsar:PhysicalCondition /> 
     <bsar:SourceFund /> 
     <bsar:Designation /> 
     <bsar:EftOrWireTransfer /> 
     <bsar:ExchangeCurrency /> 
     <bsar:GovernmentPaymentReceipt /> 
     <bsar:MultipleAccounts /> 
     <bsar:NonCashMonetaryInstr /> 
     <bsar:StrawMan /> 
     <bsar:MoneyLaunderingBlackMarket /> 
     <bsar:OutOfPatterns /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:MoneyLaundering> 
    <bsar:IdentificationDocumentation> 
     <bsar:ChangeName /> 
     <bsar:MultiIndiWithSameSimilarName /> 
     <bsar:QuestionableOrfalseDoc /> 
     <bsar:RefusedDoc /> 
     <bsar:MultipleIdentities /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:IdentificationDocumentation> 
    <bsar:OtherSuspicoiusActivities> 
     <bsar:AccountTakeOver /> 
     <bsar:BriberyOrGratuity /> 
     <bsar:CounterfeitInstr /> 
     <bsar:ElderFinancial /> 
     <bsar:Embezzlement /> 
     <bsar:Forgeries /> 
     <bsar:IdentifyTheft /> 
     <bsar:LittleNoConcerns /> 
     <bsar:MisuseFreeLook /> 
     <bsar:MisusePosition /> 
     <bsar:SuspectedDomesticCorruption /> 
     <bsar:SuspectedForeignCorruption /> 
     <bsar:SuspiciousUseInformationValueSys /> 
     <bsar:SuspiciousUseMultiLoc /> 
     <bsar:NoPurpose /> 
     <bsar:TwoOrMoreWorkingTogether /> 
     <bsar:UnAuthorizedEInstrusion /> 
     <bsar:UnLicensedMSB /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:OtherSuspicoiusActivities> 
    <bsar:Insurance> 
     <bsar:ExcessiveInsurance>A</bsar:ExcessiveInsurance> 
     <bsar:ExcessiveOrUnusalCash /> 
     <bsar:ProceedsFromUnrelated3rd /> 
     <bsar:LifeSettlement /> 
     <bsar:PolicyTermination /> 
     <bsar:UnclearNoInterest /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Insurance> 
    <bsar:SecuritiesFutureOptions> 
     <bsar:InsiderTrading /> 
     <bsar:WashTrading /> 
     <bsar:Misappropriation /> 
     <bsar:UnauthorizedPooling /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:SecuritiesFutureOptions> 
    <bsar:MortgageFraud> 
     <bsar:Appraisal /> 
     <bsar:Foreclosure /> 
     <bsar:LoanModification /> 
     <bsar:ReverseMortgage /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:MortgageFraud> 
    <bsar:Product> 
     <bsar:BondsNotes>A</bsar:BondsNotes> 
     <bsar:CommercialMtgg /> 
     <bsar:CommercialPaper /> 
     <bsar:CreditCard /> 
     <bsar:DebitCard /> 
     <bsar:ForexTrans /> 
     <bsar:FutureOptionsOnFu /> 
     <bsar:HedgeFund /> 
     <bsar:HomeEquityLoan /> 
     <bsar:HomeEquityLine /> 
     <bsar:InsuranceAnuity /> 
     <bsar:MutualFund /> 
     <bsar:OptionsOnSec /> 
     <bsar:PennyStocks /> 
     <bsar:PrepaidAccess /> 
     <bsar:ResidentialMtgg /> 
     <bsar:SecurityFuture /> 
     <bsar:Stocks /> 
     <bsar:SwapHybridDer /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Product> 
    <bsar:InstrumentOrPayment> 
     <bsar:BankCheck /> 
     <bsar:ForeignCurrency /> 
     <bsar:FundsTransfer /> 
     <bsar:GamingInstrm /> 
     <bsar:GovernmentPayment /> 
     <bsar:MoneyOrders /> 
     <bsar:PersonalCheck /> 
     <bsar:TravelersCheck /> 
     <bsar:USCurrency /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:InstrumentOrPayment> 
    <bsar:InternalControlNumber>654321654321</bsar:InternalControlNumber> 
    <bsar:CommodityTypeRecord> 
     <bsar:CommodityType>commodity type</bsar:CommodityType> 
    </bsar:CommodityTypeRecord> 
    <bsar:ProductInstrumentDescRecord> 
     <bsar:ProductInstrumentDesc>product description</bsar:ProductInstrumentDesc> 
    </bsar:ProductInstrumentDescRecord> 
    <bsar:MarketTradedRecord> 
     <bsar:MarketTraded>101</bsar:MarketTraded> 
    </bsar:MarketTradedRecord> 
    <bsar:IPAddressRecord> 
     <bsar:IPAddress>255.255.255.255</bsar:IPAddress> 
    </bsar:IPAddressRecord> 
    <bsar:CUSIPNumberRecord> 
     <bsar:CUSIPNumber>3465431654</bsar:CUSIPNumber> 
    </bsar:CUSIPNumberRecord> 
</bsar:SuspiciousActivityInformation> <!--3A--> 

<bsar:FinancialInstitutionInformation> 
    <bsar:LegalName>Bank of America</bsar:LegalName> 
</bsar:FinancialInstitutionInformation> <!--2B--> 
<bsar:SuspiciousActivityInformation> 
    <bsar:FilingType>A</bsar:FilingType> 
    <bsar:ContinuingActivity /> 
    <bsar:JointReport /> 
    <ucc:DocumentControlNumber xmlns:ucc="http://www.fincen.gov/bsa/ucommon-components/2011-06-01" /> 
    <bsar:ViolationAmount /> 
    <bsar:AmountUnKnownOrNotInvolved>B</bsar:AmountUnKnownOrNotInvolved> 
    <bsar:FromSuspiciousActivityDate>12312012</bsar:FromSuspiciousActivityDate> 
    <bsar:ToSuspiciousActivityDate>12312012</bsar:ToSuspiciousActivityDate> 
    <bsar:CumulativeAmount /> 
    <bsar:Structuring> 
     <bsar:AltersTransactionBSA>A</bsar:AltersTransactionBSA> 
     <bsar:AltersTransactionCTR /> 
     <bsar:CustomerCancels /> 
     <bsar:MultipleTransactions /> 
     <bsar:MultipleTransactionsCTR /> 
     <bsar:SuspiciousInquiry /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Structuring> 
    <bsar:TerroristFinanacing> 
     <bsar:KnownTerroristOrg /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:TerroristFinanacing> 
    <bsar:Fraud> 
     <bsar:ACH /> 
     <bsar:BusinessLoan /> 
     <bsar:Check /> 
     <bsar:ConsumerLoan /> 
     <bsar:CreditDebitCard /> 
     <bsar:HealthCare /> 
     <bsar:Mail /> 
     <bsar:MassMarketing /> 
     <bsar:PyramidScheme /> 
     <bsar:Wire /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Fraud> 
    <bsar:Casinos> 
     <bsar:InquiryOnEOB /> 
     <bsar:MinimalGaming /> 
     <bsar:IntraCasinoFundTransfer /> 
     <bsar:CounterChecksorMarkers /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Casinos> 
    <bsar:MoneyLaundering> 
     <bsar:ExchangeSmallBig /> 
     <bsar:PhysicalCondition /> 
     <bsar:SourceFund /> 
     <bsar:Designation /> 
     <bsar:EftOrWireTransfer /> 
     <bsar:ExchangeCurrency /> 
     <bsar:GovernmentPaymentReceipt /> 
     <bsar:MultipleAccounts /> 
     <bsar:NonCashMonetaryInstr /> 
     <bsar:StrawMan /> 
     <bsar:MoneyLaunderingBlackMarket /> 
     <bsar:OutOfPatterns /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:MoneyLaundering> 
    <bsar:IdentificationDocumentation> 
     <bsar:ChangeName /> 
     <bsar:MultiIndiWithSameSimilarName /> 
     <bsar:QuestionableOrfalseDoc /> 
     <bsar:RefusedDoc /> 
     <bsar:MultipleIdentities /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:IdentificationDocumentation> 
    <bsar:OtherSuspicoiusActivities> 
     <bsar:AccountTakeOver /> 
     <bsar:BriberyOrGratuity /> 
     <bsar:CounterfeitInstr /> 
     <bsar:ElderFinancial /> 
     <bsar:Embezzlement /> 
     <bsar:Forgeries /> 
     <bsar:IdentifyTheft /> 
     <bsar:LittleNoConcerns /> 
     <bsar:MisuseFreeLook /> 
     <bsar:MisusePosition /> 
     <bsar:SuspectedDomesticCorruption /> 
     <bsar:SuspectedForeignCorruption /> 
     <bsar:SuspiciousUseInformationValueSys /> 
     <bsar:SuspiciousUseMultiLoc /> 
     <bsar:NoPurpose /> 
     <bsar:TwoOrMoreWorkingTogether /> 
     <bsar:UnAuthorizedEInstrusion /> 
     <bsar:UnLicensedMSB /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:OtherSuspicoiusActivities> 
    <bsar:Insurance> 
     <bsar:ExcessiveInsurance>A</bsar:ExcessiveInsurance> 
     <bsar:ExcessiveOrUnusalCash /> 
     <bsar:ProceedsFromUnrelated3rd /> 
     <bsar:LifeSettlement /> 
     <bsar:PolicyTermination /> 
     <bsar:UnclearNoInterest /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Insurance> 
    <bsar:SecuritiesFutureOptions> 
     <bsar:InsiderTrading /> 
     <bsar:WashTrading /> 
     <bsar:Misappropriation /> 
     <bsar:UnauthorizedPooling /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:SecuritiesFutureOptions> 
    <bsar:MortgageFraud> 
     <bsar:Appraisal /> 
     <bsar:Foreclosure /> 
     <bsar:LoanModification /> 
     <bsar:ReverseMortgage /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:MortgageFraud> 
    <bsar:Product> 
     <bsar:BondsNotes>A</bsar:BondsNotes> 
     <bsar:CommercialMtgg /> 
     <bsar:CommercialPaper /> 
     <bsar:CreditCard /> 
     <bsar:DebitCard /> 
     <bsar:ForexTrans /> 
     <bsar:FutureOptionsOnFu /> 
     <bsar:HedgeFund /> 
     <bsar:HomeEquityLoan /> 
     <bsar:HomeEquityLine /> 
     <bsar:InsuranceAnuity /> 
     <bsar:MutualFund /> 
     <bsar:OptionsOnSec /> 
     <bsar:PennyStocks /> 
     <bsar:PrepaidAccess /> 
     <bsar:ResidentialMtgg /> 
     <bsar:SecurityFuture /> 
     <bsar:Stocks /> 
     <bsar:SwapHybridDer /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:Product> 
    <bsar:InstrumentOrPayment> 
     <bsar:BankCheck /> 
     <bsar:ForeignCurrency /> 
     <bsar:FundsTransfer /> 
     <bsar:GamingInstrm /> 
     <bsar:GovernmentPayment /> 
     <bsar:MoneyOrders /> 
     <bsar:PersonalCheck /> 
     <bsar:TravelersCheck /> 
     <bsar:USCurrency /> 
     <bsar:Other /> 
     <bsar:OtherSpecify /> 
    </bsar:InstrumentOrPayment> 
    <bsar:InternalControlNumber>654321654321</bsar:InternalControlNumber> 
    <bsar:CommodityTypeRecord> 
     <bsar:CommodityType>commodity type</bsar:CommodityType> 
    </bsar:CommodityTypeRecord> 
    <bsar:ProductInstrumentDescRecord> 
     <bsar:ProductInstrumentDesc>product description</bsar:ProductInstrumentDesc> 
    </bsar:ProductInstrumentDescRecord> 
    <bsar:MarketTradedRecord> 
     <bsar:MarketTraded>101</bsar:MarketTraded> 
    </bsar:MarketTradedRecord> 
    <bsar:IPAddressRecord> 
     <bsar:IPAddress>255.255.255.255</bsar:IPAddress> 
    </bsar:IPAddressRecord> 
    <bsar:CUSIPNumberRecord> 
     <bsar:CUSIPNumber>3465431654</bsar:CUSIPNumber> 
    </bsar:CUSIPNumberRecord> 
</bsar:SuspiciousActivityInformation> <!--3A--> 
<bsar:SubjectInformation> 
    <bsar:Entity /> 
    <bsar:SubjectInformationUnavailable /> 
    <bsar:LastNameOrNameOfEntity>Ceriello</bsar:LastNameOrNameOfEntity> 
</bsar:SubjectInformation> <!--4A--> 
<bsar:SubjectInformation> 
    <bsar:Entity /> 
    <bsar:SubjectInformationUnavailable>B</bsar:SubjectInformationUnavailable> 
    <bsar:LastNameOrNameOfEntity>Gutierrez</bsar:LastNameOrNameOfEntity> 
</bsar:SubjectInformation> <!--4A--> 
<bsar:SubjectInformation> 
    <bsar:Entity /> 
    <bsar:SubjectInformationUnavailable /> 
    <bsar:LastNameOrNameOfEntity>Roper</bsar:LastNameOrNameOfEntity> 
</bsar:SubjectInformation> <!--4A--> 

基本上,僞代碼是這樣的:

Output 1A 

For each 2A 

    Output 2A 

    For each 2B before the next 2A 

     Output 2B 

     For each 3A before the next 2B 

      Output 3A; increment counter 

       For each 4A before the next 3A 

        Output 4A with above counter 

文本將基本上需要在被格式化命令它在文件中,並帶有一些摘要部分(例如每個2B之後)。我無法弄清楚如何遍歷3A之後的元素,例如不循環遍歷文檔中的所有4A記錄。對於每個3A,我還需要保留一個計數器,以便我可以輸出3A部分和相關4A部分的文本。

最初,我設計了一系列循環,遍歷文件中的每個元素併爲每個元素調用一次,但是我意識到將會挑選文件中的所有元素,而不僅僅是那些出現在我想要查看該部分的相關(父級)元素下面。

然後,我考慮使用捕獲所有元素,以便它們在文件中出現的順序處理。但是,如果我這樣做的話,我不知道如何使用任何類型的計數器。 (我知道我不能使用一個實際的計數器,但我的爭論是在每個循環內調用一個模板並通過位置()作爲參數)

請讓我知道,如果您有任何建議去與此。我有一些XSL的經驗,但這有點不同於我以前的習慣。

在此先感謝。

編輯:

輸出應該出來找這樣的事:

1A Transmitter info 
2A Filing Institution Info 
2B Financial Institution Info 
3A Suspicious Activity Info 
9A Suspicious Activity Summary Info 
2B Financial Institution 2 Info 
3A Suspicious Activity 2 Info 
4A Subject 1 Info 
4A Subject 2 Info 
4A Subject 3 Info 
9B Filing institution Summary info 

下面是一些XSL,我已經盡力了,但我確定,因爲這些環遍歷所有的記錄將無法正常工作類型在整個文檔中,而不僅僅是作爲父代的兄弟元素之後的那些類型:

<xsl:template match="/bsar:BSAForm"> 
    <xsl:for-each select="bsar:FilingInstitutionInformation"> 
     <xsl:call-template name="FileInstInfo"/> <!--2A--> 
     <xsl:for-each select="../bsar:FinancialInstitutionInformation"> 
      <xsl:call-template name="FinInstActivity"/> <!--2B--> 
      <xsl:for-each select="../bsar:SuspiciousActivityInformation"> 
       <xsl:call-template name="SuspActivityInfo"/> <!--3A--> 
       <xsl:for-each select="../bsar:SubjectInformation"> 
        <xsl:call-template name="Subject"/> <!--4A--> 
       </xsl:for-each> 
       <xsl:for-each select="../bsar:SuspiciousActivityInformationNarrative"> 
        <xsl:call-template name="NarrativeDesc"/> <!--5A--> 
       </xsl:for-each> 
       <xsl:call-template name="SuspActivityInfoSmry"/> <!--9A--> 
      </xsl:for-each> 
     </xsl:for-each> 
     <xsl:call-template name="FileInstSmry"/> <!--9B--> 
    </xsl:for-each> 
    <xsl:call-template name="FileSmry"/> <!--9Z--> 
</xsl:template> 

<xsl:template name="FileInstInfo" match="bsar:FilingInstitutionInformation"> 

    <xsl:variable name="FIType" select="bsar:FIType"/> 
    <xsl:variable name="SecFuType" select="bsar:SecuritiesFuturesType"/> 
    <xsl:variable name="FIId" select="bsar:FIIdentification"/> 
    <xsl:variable name="FIIdType" select="$FIId/ucc:FIIDType"/> 
    <xsl:variable name="Addr" select="bsar:FIAddress"/> 
    <xsl:variable name="Country" select="$Addr/ucc:Country"/> 
    <xsl:variable name="ZIP" select="translate($Addr/ucc:ZIP, translate($Addr/ucc:ZIP, '', ''), '')"/> 
    <xsl:variable name="FinInstType" select="$FIType/ucc:FinInsType"/> 

    <!-- 1-2(2) Record Type --> 
    <xsl:text xml:space="preserve">2A</xsl:text> 

    <!-- 3-4(2) Part IV Primary Federal Regulator --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="bsar:PrimaryRegulator"/> 
     <xsl:with-param name="length" select="2"/> 
    </xsl:call-template> 

    <!-- 5-154(150) Part IV Filer Name --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="bsar:FilerName"/> 
     <xsl:with-param name="length" select="150"/> 
    </xsl:call-template> 

    <!-- 155-179(25) Part IV TIN --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="translate(bsar:TIN, translate(bsar:TIN, '', ''), '')"/> 
     <xsl:with-param name="length" select="25"/> 
    </xsl:call-template> 

    <!-- 180(1) Part IV TIN Type --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="bsar:TINTYPE"/> 
     <xsl:with-param name="length" select="1"/> 
    </xsl:call-template> 

    <!-- 181(1) Part IV Type of Financial Institution --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$FinInstType"/> 
     <xsl:with-param name="length" select="1"/> 
    </xsl:call-template> 

    <!-- 182-231(50) Part IV Type of Financial Institution - Other --> 
    <xsl:variable name="FinInstTypeOther"> 
     <xsl:choose> 
      <xsl:when test="$FinInstType = 'Z'"> 
       <xsl:value-of select="$FIType/ucc:OtherSpecify"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="''"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$FinInstTypeOther"/> 
     <xsl:with-param name="length" select="50"/> 
    </xsl:call-template> 

    <!-- 232-244(13) Part IV Type of Securities and Futures Institution --> 
    <xsl:variable name="SecFuInstType"> 
     <xsl:choose> 
      <xsl:when test="$FinInstType = 'E'"> 
       <xsl:for-each select="$SecFuType/*"> 
        <xsl:if test="position() != last()"> 
         <xsl:value-of select="."/> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="''"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$SecFuInstType"/> 
     <xsl:with-param name="length" select="13"/> 
    </xsl:call-template> 

    <!-- 245-294(50) Part IV Type of Securities and Futures Institution - Other --> 
    <xsl:variable name="SecFuInstOtherSpecify"> 
     <xsl:choose> 
      <xsl:when test="contains($SecFuInstType,'Z')"> 
       <xsl:value-of select="$SecFuType/bsar:OtherSpecify"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="''"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$SecFuInstOtherSpecify"/> 
     <xsl:with-param name="length" select="50"/> 
    </xsl:call-template> 

    <!-- 295(1) Part IV Financial Institution Identification Type --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$FIIdType"/> 
     <xsl:with-param name="length" select="1"/> 
    </xsl:call-template> 

    <!-- 296-315(20) Part IV Financial Institution Identification Number --> 
    <xsl:variable name="FIIdNumber"> 
     <xsl:choose> 
      <xsl:when test="$FIIdType != ''"> 
       <xsl:value-of select="$FIId/ucc:FIIDNumber"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="''"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$FIIdNumber"/> 
     <xsl:with-param name="length" select="20"/> 
    </xsl:call-template> 

    <!-- 316-415(100) Part IV Address --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$Addr/ucc:Address"/> 
     <xsl:with-param name="length" select="100"/> 
    </xsl:call-template> 

    <!-- 416-465(50) Part IV City --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$Addr/ucc:City"/> 
     <xsl:with-param name="length" select="50"/> 
    </xsl:call-template> 

    <!-- 466-468(3) Part IV State --> 
    <xsl:variable name="State"> 
     <xsl:choose> 
      <xsl:when test="$Country = 'CA' or $Country = 'US' or $Country = 'MX'"> 
       <xsl:value-of select="$Addr/ucc:State"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="''"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$State"/> 
     <xsl:with-param name="length" select="3"/> 
    </xsl:call-template> 

    <!-- 469-477(9) Part IV Zip/Postal Code --> 
    <xsl:variable name="ZipCode"> 
     <xsl:choose> 
      <xsl:when test="$Country = 'US' and (string-length($ZIP) = 9 and (substring($ZIP, 6, 9) = '0000' or substring($ZIP, 6, 9) = '9999'))"> 
       <xsl:value-of select="substring($ZIP, 1, 5)"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$ZIP"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$ZipCode"/> 
     <xsl:with-param name="length" select="9"/> 
    </xsl:call-template> 

    <!-- 478-479(2) Part IV Country --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="$Country"/> 
     <xsl:with-param name="length" select="2"/> 
    </xsl:call-template> 

    <!-- 480-629(150) Part IV Alternate Name --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="./bsar:AlternateName"/> 
     <xsl:with-param name="length" select="150"/> 
    </xsl:call-template> 

    <!-- 630-1190(561) Filler --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="''"/> 
     <xsl:with-param name="length" select="561"/> 
    </xsl:call-template> 

    <!-- 1191-1200(10) User Field --> 
    <xsl:call-template name="append-pad"> 
     <xsl:with-param name="text" select="''"/> 
     <xsl:with-param name="length" select="10"/> 
    </xsl:call-template> 

    <xsl:value-of select="$newline" /> 

</xsl:template> 

<xsl:template name="append-pad"> 
    <!-- recursive template to left justify and append --> 
    <!-- the value with whatever padding is passed in --> 
    <xsl:param name="padding" xml:space="preserve"> </xsl:param> 
    <xsl:param name="text"/> 
    <xsl:param name="length"/> 
    <xsl:choose> 
     <xsl:when test="string-length($text) &lt; $length"> 
      <xsl:call-template name="append-pad"> 
       <xsl:with-param name="padding" select="$padding"/> 
       <xsl:with-param name="text" select="concat($text,$padding)"/> 
       <xsl:with-param name="length" select="$length"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="substring($text,1,$length)"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

第一部分應該產生以下NG輸出:(間距ommitted這個崗位)

2AD銀行新Corp.373637383ACD654646321321Ave XBrooklynNY11235USalternate名

+1

輸入是實際的XML還是它看起來像你的文章中的內容?如果是XML,請編輯您的帖子並顯示實際數據。 – 2013-02-20 18:49:23

+0

我添加了真正的XMl。請注意,這是在Sharepoint 2007中,因此它可能是XSLT 1.0。謝謝! – 2013-02-20 19:38:29

+1

從可回答的問題來看,你還有很長的路要走。請提供您期望的樣本(縮小爲僅顯示「有趣」的部分)以及您已經嘗試過的XSL。如果你正在使用循環,這可能是錯誤的方法。從[身份轉換](http://en.wikipedia.org/wiki/Identity_transform)開始,然後使用更具體的模板處理異常情況。 – 2013-02-20 19:49:55

回答

2

我不知道是否有人真正理解我的問題,但如果有人來這裏面臨着類似的問題,這裏是我怎麼解決它:

<xsl:template match="/bsar:BSAForm"> 
    <xsl:call-template name="Transmitter"/> 
    <xsl:apply-templates select="bsar:FilingInstitutionInformation" /> 
    <xsl:call-template name="FileSmry"/> 
</xsl:template> 

<xsl:template match="bsar:FilingInstitutionInformation"> 

    <xsl:variable name="FileInstHeader" select="."/> 

    <xsl:call-template name="FileInstInfo"/> 

    <!--For each 2B before the next 2A--> 
    <xsl:for-each select="following-sibling::bsar:FinancialInstitutionInformation[preceding-sibling::bsar:FilingInstitutionInformation[1] = $FileInstHeader]"> 
     <!--Output 2B--> 
     <xsl:call-template name="FinInstActivity"/> 
     <xsl:variable name="FinInstHeader" select="."/> 
     <!--For each 3A before the next 2B--> 
     <xsl:for-each select="following-sibling::bsar:SuspiciousActivityInformation[preceding-sibling::bsar:FinancialInstitutionInformation[1] = $FinInstHeader]"> 
      <!--Output 3A; Increment counter--> 
      <xsl:variable name="TranSeqNum"> 
       <xsl:number count="bsar:SuspiciousActivityInformation" /> 
      </xsl:variable> 
      <xsl:call-template name="SuspActivityInfo"> 
       <xsl:with-param name="TranSeqNum" select="$TranSeqNum"/> 
      </xsl:call-template> 
      <xsl:variable name="SuspActHeader" select="."/> 
      <!--For each 4A before the next 3A--> 
      <xsl:for-each select="following-sibling::bsar:SubjectInformation[preceding-sibling::bsar:SuspiciousActivityInformation[1] = $SuspActHeader]"> 
       <!--Output 4A with above counter--> 
       <xsl:call-template name="Subject"> 
        <xsl:with-param name="TranSeqNum" select="$TranSeqNum"/> 
       </xsl:call-template> 
      </xsl:for-each> 
      <!--Output 9A--> 
      <!--<xsl:call-template name="SuspActivityInfoSmry"/>--> 
     </xsl:for-each> 
    </xsl:for-each> 

    <!--Output 9B--> 
    <xsl:call-template name="FileInstSmry"/> 

</xsl:template> 

的「發射器」記錄需要在開始時顯示一次(這表明模板是無關緊要的)和FileInstSmry記錄需要在結局展示一次。其他一切按2A記錄分組。調用將調用文檔中找到的每個標籤的模板。對於他們發現的每一個,模板的細節將被調用(),然後每次運行FilingInsitutionInformation模板時都會運行內部循環。

FileInstHeader包含父元素,因此每個循環的第一個循環會一直運行,直到其中一個元素被命中。標題變量設置爲下一個父級,並繼續循環。我還沒有弄清楚3A和4A部分的計數器,但如果有人感興趣,我可以在這一點上更新。

+0

嗨,傑西,你可以請你發佈你的完整xsl嗎?我正在嘗試做類似的事情。 – Rushik 2014-09-14 17:30:55