我正在解析XML,该XML将被转换为文本并提交给FinCEN,FinCEN要求它具有非常特定的格式。基本上,我会得到一个xml文件,其中的元素都排列为兄弟元素,它们之间的关联基于文件中的出现顺序。所以我可能有一个看起来像这样的文件:
<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部分的文本一起输出。
最初,我设计了一系列循环,这些循环将遍历文件中的每个元素,并为每个元素调用一次相应的循环,但我意识到这将挑选出文件中的所有元素,而不仅仅是我希望在该部分中看到的相关(父)元素下面的元素。
然后,我考虑使用catch-all,这样所有元素都将按照它们在文件中出现的顺序进行处理。然而,如果我这样做,我不知道我怎么能使用任何类型的计数器。(我知道我不能使用实际的计数器,但我的争论是在for每个循环中调用一个模板,并将position()作为参数传递)
如果你有什么建议,请告诉我。我有一些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, '0123456789', ''), '')"/>
<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, '0123456789', ''), '')"/>
<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) < $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>
第一部分应该产生以下输出:(为此帖子提交的间距)
2AD新银行公司.373637383ACD654646321321Ave XBrooklynNY11235US别名
我不确定是否有人真的理解我的问题,但如果有人来这里面临类似的问题,下面是我如何解决的:
<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>
"Transmitter"记录需要在开始时显示一次(表明模板不相关),FileInstSmry记录需要在结束时显示一个。其他所有内容都按2A记录分组。调用将调用文档中每个标签的模板。对于找到的每个模板,模板的详细信息都将被调用(),然后每次运行FilingInsituationInformation模板时都会运行内部循环。
FileInstHeader包含父元素,因此每个循环的第一个循环都会运行,直到命中其中的另一个元素为止。标头变量被设置为下一个父级,循环继续。我还没有弄清楚3A和4A部分的计数器,但如果有人感兴趣,我可以在那时更新它。