在一个 XSLT 文件中,我需要转换 XML 并删除生成的 XML 上的空标记。
我正在尝试向我的 XSLT 代码添加额外的模板以删除空元素。使用 XSLT 1.0,我发现我需要使用 mode 属性来首先执行转换,然后通过将初始结果存储在变量中来从中删除空标记。
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common">
<xsl:strip-space elements="*" />
<xsl:output indent="yes" />
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node()|@*" mode="mPass2">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="mPass2"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vrtfPass1Result">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates mode="mPass2"
select="ext:node-set($vrtfPass1Result)/*"/>
</xsl:template>
<xsl:template match="/Root/Element">
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:DRAFT1auth.052.001.01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:DRAFT1auth.052.001.01 file://LON-SLFILE04/MDingle$/My%20Documents/SFTR/Schema/DRAFT_SFTR_documentation/DRAFT1auth.052.001.01.xsd">
<SctiesFincgRptgTxRpt>
<TradData>
<New>
<TechRcrdId>a</TechRcrdId>
<CtrPtyData>
<RptgDtTm><xsl:value-of select="@Reporting_timestamp" /></RptgDtTm>
<RptSubmitgNtty><xsl:value-of select="@Report_submitting_entity" /></RptSubmitgNtty>
<CtrPtyData>
<RptgCtrPty>
<Id>
<LEI><xsl:value-of select="@Reporting_counterparty" /></LEI>
</Id>
<Ntr>
<xsl:if test="@Nature_of_the_reporting_counterparty = 'N'" >
<NFI><xsl:value-of select="@Nature_of_the_reporting_counterparty" /></NFI>
</xsl:if>
<FI>
<xsl:if test="@Nature_of_the_reporting_counterparty = 'F'" >
<xsl:value-of select="@Nature_of_the_reporting_counterparty" />
</xsl:if>
<Clssfctn><xsl:value-of select="@Sector_of_the_reporting_counterparty" /></Clssfctn>
<InvstmtFndClssfctn><xsl:value-of select="@Additional_sector_classification" /></InvstmtFndClssfctn>
</FI>
</Ntr>
<Brnch>
<Id>
<xsl:if test="string-length(Branch_of_the_reporting_counterparty) > 3" >
<LE><xsl:value-of select="@Branch_of_the_reporting_counterparty" /></LE>
</xsl:if>
<xsl:if test="string-length(Branch_of_the_reporting_counterparty) < 3" >
<Ctry><xsl:value-of select="@Branch_of_the_reporting_counterparty" /></Ctry>
</xsl:if>
</Id>
</Brnch>
<Sd><xsl:value-of select="@Counterparty_side" /></Sd>
</RptgCtrPty>
<OthrCtrPty>
<Id>
<xsl:if test="string-length(Branch_of_the_other_counterparty) > 3" >
<LE><xsl:value-of select="@Branch_of_the_other_counterparty" /></LE>
</xsl:if>
<xsl:if test="string-length(Other_counterparty) < 21" >
<LEI><xsl:value-of select="@Other_counterparty" /></LEI>
</xsl:if>
<xsl:if test="string-length(Other_counterparty) > 21" >
<Clntld><xsl:value-of select="@Other_counterparty" /></Clntld>
</xsl:if>
</Id>
<xsl:if test="string-length(Branch_of_the_other_counterparty) < 3" >
<Ctry><xsl:value-of select="@Branch_of_the_other_counterparty" /></Ctry>
</xsl:if>
<CtryCd><xsl:value-of select="@Country_of_the_other_Counterparty" /></CtryCd>
</OthrCtrPty>
<NttyRspnsblForRpt><xsl:value-of select="@Entity_responsible_for_the_report" /></NttyRspnsblForRpt>
<TxCtrPtyData>
<RpTrad>
<Bnfcry><xsl:value-of select="@Beneficiary" /></Bnfcry>
<TrptyAgt><xsl:value-of select="@Tri-party_agent" /></TrptyAgt>
<Brkr><xsl:value-of select="@Broker" /></Brkr>
<ClrMmb><xsl:value-of select="@Clearing_member" /></ClrMmb>
<SttlmPties>
<CntrlSctiesDpstryPtcpt><xsl:value-of select="@CSD_participant_or_indirect_participant" /></CntrlSctiesDpstryPtcpt>
<IndrctPtcpt><xsl:value-of select="@CSD_participant_or_indirect_participant" /></IndrctPtcpt>
</SttlmPties>
<AgtLndr><xsl:value-of select="@Agent_lender" /></AgtLndr>
</RpTrad>
</TxCtrPtyData>
</CtrPtyData>
</CtrPtyData>
<LnData>
<UnqTradIdr><xsl:value-of select="@Unique_Transaction_Identifier__x0028_UTI_x0029_" /></UnqTradIdr>
<EvtDt><xsl:value-of select="@Event_date" /></EvtDt>
<CtrctTp><xsl:value-of select="@Type_of_SFT" /></CtrctTp>
<ExctnDtTm><xsl:value-of select="@Execution_timestamp" /></ExctnDtTm>
<TxLnData>
<RpTrad>
<ClrSts>
<Clrd>
<RptTrckgNbc><xsl:value-of select="@Report_tracking_number" /></RptTrckgNbc>
<xsl:if test="@Cleared = 'true'" >
<xsl:value-of select="@Cleared" />
</xsl:if>
<ClrDtTm><xsl:value-of select="@Clearing_timestamp" /></ClrDtTm>
<CCP><xsl:value-of select="@CCP" /></CCP>
<PrtflCd><xsl:value-of select="@Portfolio_code" /></PrtflCd>
</Clrd>
<xsl:if test="not(@Cleared = 'true')" >
<NonClrd><xsl:value-of select="@Cleared" /></NonClrd>
</xsl:if>
</ClrSts>
<TradgVn><xsl:value-of select="@Trading_venue" /></TradgVn>
<MstrAgrmt>
<Tp>
<xsl:if test="@Master_Agreement_Type_Enumerations_Check = 'true'" >
<Tp>
<xsl:value-of select="@Master_agreement_type" />
</Tp>
</xsl:if>
<xsl:if test="not(@Master_Agreement_Type_Enumerations_Check = 'true')" >
<Prtry>
<xsl:value-of select="@Master_agreement_type" />
</Prtry>
</xsl:if>
</Tp>
<OthrMstrAgrmt><xsl:value-of select="@Other_master_agreement_type" /></OthrMstrAgrmt>
<Vrsn><xsl:value-of select="@Master_agreement_version" /></Vrsn>
</MstrAgrmt>
<ValDt><xsl:value-of select="@Value_date__x0028_Start_date_x0029_" /></ValDt>
<MinNtcePrd><xsl:value-of select="@Minimum_notice_period" /></MinNtcePrd>
<EarlstCallBckDt><xsl:value-of select="@Earliest_call-back_date" /></EarlstCallBckDt>
<GnlColl><xsl:value-of select="@General_collateral_indicator" /></GnlColl>
<DlvryByVal><xsl:value-of select="@DBV_indicator" /></DlvryByVal>
<CollDlvryMtd><xsl:value-of select="@Method_used_to_provide_collateral" /></CollDlvryMtd>
<Term>
<Fxd>
<MtrtyDt><xsl:value-of select="@Maturity_date__x0028_End_date_x0029_" /></MtrtyDt>
<TermntnOptn><xsl:value-of select="@Termination_optionality" /></TermntnOptn>
</Fxd>
<Opn><xsl:value-of select="@Open_term" /></Opn>
</Term>
<IntrstRate>
<Fxd>
<Rate><xsl:value-of select="@Fixed_rate" /></Rate>
<DayCntBsis>
<xsl:if test="@Day_Count_Convention_Enumerations_Check = 'true'" >
<Cd><xsl:value-of select="@Day_count_convention" /></Cd>
</xsl:if>
<xsl:if test="not(@Day_Count_Convention_Enumerations_Check = 'true')" >
<Prtry><xsl:value-of select="@Day_count_convention" /></Prtry>
</xsl:if>
</DayCntBsis>
</Fxd>
<Fltg>
<RefRate>
<xsl:if test="@Floating_Rate_Enumerations_Check = 'true'" >
<Indx><xsl:value-of select="@Floating_rate" /></Indx>
</xsl:if>
<xsl:if test="not(@Floating_Rate_Enumerations_Check = 'true')" >
<Nm><xsl:value-of select="@Floating_rate" /></Nm>
</xsl:if>
</RefRate>
<Term>
<Unit><xsl:value-of select="@Floating_rate_reference_period_-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rate_reference_period_-_multiplier" /></Val>
</Term>
<PmtFrqcy>
<Unit><xsl:value-of select="@Floating_rate_payment_frequency_-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rate_payment_frequency_-_multiplier" /></Val>
</PmtFrqcy>
<RstFrqcy>
<Unit><xsl:value-of select="@Floating_rate_reset_frequency-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rate_reset_frequency_-_multiplier" /></Val>
</RstFrqcy>
<BsisPtSprd><xsl:value-of select="@Spread" /></BsisPtSprd>
<MrgnLnAmt>
<xsl:attribute name = "Ccy">
<xsl:value-of select="@Margin_lending_currency" />
</xsl:attribute>
<xsl:value-of select="@Margin_lending_currency_amount" />
</MrgnLnAmt>
<RateAdjstmnt>
<Rate><xsl:value-of select="@Adjusted_rate" /></Rate>
<AdjstmntDt><xsl:value-of select="@Rate_date" /></AdjstmntDt>
</RateAdjstmnt>
</Fltg>
</IntrstRate>
<PrncplAmt>
<ValDtAmt><xsl:value-of select="@Principal_amount_on_value_date" /></ValDtAmt>
<MtrtyDtAmt><xsl:value-of select="@Principal_amount_on_maturity_date" /></MtrtyDtAmt>
<Ccy><xsl:value-of select="@Principal_amount_currency" /></Ccy>
</PrncplAmt>
<NetXpsrCollstnInd><xsl:value-of select="@Collateralisation_of_net_exposure" /></NetXpsrCollstnInd>
</RpTrad>
<SctiesLndg>
<AsstTp>
<xsl:value-of select="@Type_of_asset" />
<Scty>
<Id><xsl:value-of select="@Security_Identifier" /></Id>
<Clssfctn><xsl:value-of select="@Classification_of_a_security" /></Clssfctn>
<Qty><xsl:value-of select="@Quantity_or_nominal_amount" /></Qty>
<QtyOrNmnlVal>
<NmnlVal>
<Ccy><xsl:value-of select="@Currency_of_nominal_amount" /></Ccy>
</NmnlVal>
</QtyOrNmnlVal>
<UnitPric>
<xsl:value-of select="@Security_or_commodity_price" />
<Ccy><xsl:value-of select="@Price_currency" /></Ccy>
</UnitPric>
<Qlty><xsl:value-of select="@Security_quality" /></Qlty>
<Mtrty><xsl:value-of select="@Maturity_of_the_security" /></Mtrty>
<Issr>
<JursdctnCtry><xsl:value-of select="@Jurisdiction_of_the_issuer" /></JursdctnCtry>
<LEI><xsl:value-of select="@LEI_of_the_issuer" /></LEI>
</Issr>
<Tp>
<Cd><xsl:value-of select="@Security_type" /></Cd>
</Tp>
</Scty>
<Cmmdty>
<Qty>
<UnitOfMeasr><xsl:value-of select="@Unit_of_measure" /></UnitOfMeasr>
</Qty>
</Cmmdty>
</AsstTp>
<LnVal><xsl:value-of select="@Loan_value" /></LnVal>
<MktVal><xsl:value-of select="@Market_value" /></MktVal>
<RbtRate>
<Rate><xsl:value-of select="@Fixed_rebate_rate" /></Rate>
<FltgRbtRate>
<RefRate>
<Indx><xsl:value-of select="@Floating_rebate_rate" /></Indx>
</RefRate>
<Term>
<Unit><xsl:value-of select="@Floating_rebate_rate_reference_period_-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rebate_rate_reference_period_-_multiplier" /></Val>
</Term>
<PmtFrqcy>
<Unit><xsl:value-of select="@Floating_rebate_rate_payment_frequency_-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rebate_rate_payment_frequency_-_multiplier" /></Val>
</PmtFrqcy>
<RstFrqcy>
<Unit><xsl:value-of select="@Floating_rebate_rate_reset_frequency-_time_period" /></Unit>
<Val><xsl:value-of select="@Floating_rebate_rate_reset_frequency-_multiplier" /></Val>
</RstFrqcy>
<BsisPtSprd><xsl:value-of select="@Spread_of_the_rebate_rate" /></BsisPtSprd>
</FltgRbtRate>
</RbtRate>
<LndgFee><xsl:value-of select="@Lending_fee" /></LndgFee>
<ExclsvArrgmnt><xsl:value-of select="@Exclusive_arrangements" /></ExclsvArrgmnt>
</SctiesLndg>
<MrgnLndg>
<OutsdngMrgnLnAmt><xsl:value-of select="@Outstanding_margin_loan" /></OutsdngMrgnLnAmt>
<Ccy><xsl:value-of select="@Base_currency_of_outstanding_margin_loan" /></Ccy>
<ShrtMktValAmt><xsl:value-of select="@Short_market_value" /></ShrtMktValAmt>
</MrgnLndg>
</TxLnData>
</LnData>
<CollData>
<SctiesLndg>
<Uncollsd><xsl:value-of select="@Uncollateralised_SL_flag" /></Uncollsd>
</SctiesLndg>
<RpTrad>
<CollValDt><xsl:value-of select="@Value_date_of_the_collateral" /></CollValDt>
<Tp>
<xsl:value-of select="@Type_of_collateral_component" />
<Csh>
<xsl:attribute name = "Ccy">
<xsl:value-of select="@Cash_collateral_currency" />
</xsl:attribute>
<xsl:value-of select="@Cash_collateral_amount" />
</Csh>
<Scties>
<Id>
<Id><xsl:value-of select="@Identification_of_a_security_used_as_collateral" /></Id>
<ClssfctnTp><xsl:value-of select="@Classification_of_a_security_used_as_collateral" /></ClssfctnTp>
<QtyOrNmnlVal>
<NmnlVal>
<xsl:attribute name = "Ccy">
<xsl:value-of select="@Currency_of_collateral_nominal_amount" />
</xsl:attribute>
</NmnlVal>
</QtyOrNmnlVal>
<HrcutOrMrgn><xsl:value-of select="@Haircut_or_margin" /></HrcutOrMrgn>
<Qlty><xsl:value-of select="@Collateral_quality" /></Qlty>
<Mtrty><xsl:value-of select="@Collateral_security_maturity" /></Mtrty>
<Issr>
<JursdctnCtry><xsl:value-of select="@Collateral_jurisdiction_of_the_issuer" /></JursdctnCtry>
<LEI><xsl:value-of select="@Collateral_LEI_of_the_issuer" /></LEI>
</Issr>
<Tp>
<xsl:if test="@Collateral_Type_Enumerations_Check = 'true'" >
<Cd><xsl:value-of select="@Collateral_type" /></Cd>
</xsl:if>
<xsl:if test="not(@Collateral_Type_Enumerations_Check = 'true')" >
<Prtry><xsl:value-of select="@Collateral_type" /></Prtry>
</xsl:if>
</Tp>
<AvlblForCollReuse><xsl:value-of select="@Availability_for_collateral_reuse" /></AvlblForCollReuse>
</Id>
</Scties>
<Cmmdty>
<Qty>
<UnitOfMeasr><xsl:value-of select="Collateral_unit_of_measure" /></UnitOfMeasr>
</Qty>
</Cmmdty>
</Tp>
<BsktIdr>
<NotAvlbl>NTAV</NotAvlbl>
</BsktIdr>
</RpTrad>
</CollData>
<xsl:value-of select="@Action_type" />
<LvlTp><xsl:value-of select="@Level" /></LvlTp>
<SplmtryData>
<PlcAndNm>a</PlcAndNm>
<Envlp>
<auto-generated_for_wildcard xmlns=""/>
</Envlp>
</SplmtryData>
</New>
<CollUpd>
<CollData>
<TxCollData>
<RpTrad>
<BsktIdr>
<xsl:if test="@Collateral_basket_identifier = 'NTAV'" >
<NotAvlbl><xsl:value-of select="@Collateral_basket_identifier" /></NotAvlbl>
</xsl:if>
<xsl:if test="not(@Collateral_basket_identifier = 'NTAV')" >
<Id><xsl:value-of select="@Collateral_basket_identifier" /></Id>
</xsl:if>
</BsktIdr>
</RpTrad>
</TxCollData>
</CollData>
</CollUpd>
</TradData>
<SplmtryData>
<PlcAndNm>a</PlcAndNm>
<Envlp>
<auto-generated_for_wildcard xmlns=""/>
</Envlp>
</SplmtryData>
</SctiesFincgRptgTxRpt>
</Document>
</xsl:template>
<xsl:template match="/*" mode="mPass2">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="mPass2"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"*[not(@*|*|comment()|processing-instruction())
and normalize-space()=''
]" mode="mPass2"/>
</xsl:stylesheet>
这是结果的摘录:
<RptgCtrPty>
<Id>
<LEI>G5GSEF7VJP5I7OUK5572</LEI>
</Id>
<Ntr>
<FI>
<Clssfctn></Clssfctn>
<InvstmtFndClssfctn></InvstmtFndClssfctn>
</FI>
</Ntr>
<Brnch>
<Id>
<Ctry></Ctry>
</Id>
</Brnch>
<Sd></Sd>
</RptgCtrPty>
我希望:
<RptgCtrPty>
<Id>
<LEI>G5GSEF7VJP5I7OUK5572</LEI>
</Id>
</RptgCtrPty>
转换工作正常,只是删除需要工作的空标签。
感谢您的帮助, 扫罗
最佳答案
尝试更改最后的 mPass2这个的模板....
<xsl:template
match="*[not(.//@*|.//comment()|.//processing-instruction()) and normalize-space()='']"
mode="mPass2"/>
因此,这将检查所有后代,而不仅仅是直系子代。 (当前节点上的 normalize-space 将应用于所有后代文本节点的串联)
关于xml - XSLT - XML 转换和删除空标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550493/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?