我们提供的XML可以在<Cd>
标记内添加<Prtry>
或<Rsn>
标记。我需要一种方法来获取任一标签内的值。下面给出了示例XML标记。
示例Xml1:
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03">
<CstmrPmtStsRpt>
<GrpHdr>
<MsgId>00000011</MsgId>
<CreDtTm>2016-02-10T01:37:43</CreDtTm>
<InitgPty>
<Id>
<OrgId>
<Othr>
<Id>XXXXXXXXX</Id>
</Othr>
</OrgId>
</Id>
</InitgPty>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>CACPA</Cd>
</ClrSysId>
<MmbId>12357677</MmbId>
</ClrSysMmbId>
<Nm>US001 NEW YORK OPERATIONS</Nm>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>CACPA</Cd>
</ClrSysId>
<MmbId>1234567</MmbId>
</ClrSysMmbId>
<Nm>Test</Nm>
<PstlAdr>
<Ctry>CA</Ctry>
</PstlAdr>
</FinInstnId>
<BrnchId>
<Id>34642</Id>
</BrnchId>
</CdtrAgt>
</GrpHdr>
<OrgnlGrpInfAndSts>
<OrgnlMsgId>00000011</OrgnlMsgId>
<OrgnlMsgNmId>pain.001.001.03</OrgnlMsgNmId>
<OrgnlNbOfTxs>1</OrgnlNbOfTxs>
<GrpSts>RJCT</GrpSts>
</OrgnlGrpInfAndSts>
<OrgnlPmtInfAndSts>
<OrgnlPmtInfId>00000011/1</OrgnlPmtInfId>
<TxInfAndSts>
<OrgnlEndToEndId>TES000000001</OrgnlEndToEndId>
<TxSts>RJCT</TxSts>
<StsRsnInf>
<Orgtr>
<Id>
<OrgId>
<Othr>
<Id>TEST123</Id>
</Othr>
</OrgId>
</Id>
</Orgtr>
<Rsn>
<Cd>TST01</Cd>
</Rsn>
<AddtlInf>SAMPLE TEXT</AddtlInf>
</StsRsnInf>
<OrgnlTxRef>
<Amt>
<InstdAmt Ccy="USD">300</InstdAmt>
</Amt>
<ReqdExctnDt>2016-02-10</ReqdExctnDt>
<PmtTpInf>
<InstrPrty>HIGH</InstrPrty>
<SvcLvl>
<Prtry>NORM</Prtry>
</SvcLvl>
</PmtTpInf>
<PmtMtd>TRF</PmtMtd>
<Dbtr>
<Nm>Niagara Region</Nm>
<PstlAdr>
<PstCd>L2V 4T7</PstCd>
<TwnNm>Thorold</TwnNm>
<CtrySubDvsn>ON</CtrySubDvsn>
<Ctry>CA</Ctry>
<AdrLine>2201 St. David's Rd.</AdrLine>
</PstlAdr>
<Id>
<OrgId>
<Othr>
<Id>4455020000</Id>
<SchmeNm>
<Cd>BANK</Cd>
</SchmeNm>
<Issr>Niagara Region</Issr>
</Othr>
</OrgId>
</Id>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id>0000182</Id>
</Othr>
</Id>
<Tp>
<Cd>CASH</Cd>
</Tp>
</DbtrAcct>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>CACPA</Cd>
</ClrSysId>
<MmbId>000304222</MmbId>
</ClrSysMmbId>
<Nm>Royal Bank of Canada</Nm>
<PstlAdr>
<PstCd>L2R 7G1</PstCd>
<TwnNm>St Catharines</TwnNm>
<CtrySubDvsn>ON</CtrySubDvsn>
<Ctry>CA</Ctry>
<AdrLine>80 King St</AdrLine>
<AdrLine>Suite #1</AdrLine>
</PstlAdr>
</FinInstnId>
</DbtrAgt>
<CdtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>CACPA</Cd>
</ClrSysId>
<MmbId>000434642</MmbId>
</ClrSysMmbId>
<Nm>TD Canada Trust</Nm>
<PstlAdr>
<Ctry>CA</Ctry>
</PstlAdr>
</FinInstnId>
<BrnchId>
<Id>34642</Id>
</BrnchId>
</CdtrAgt>
<Cdtr>
<Nm>A Child's World Family Child Care Serv. - Niag.</Nm>
<PstlAdr>
<PstCd>L3B 6E5</PstCd>
<TwnNm>Welland</TwnNm>
<CtrySubDvsn>ON</CtrySubDvsn>
<Ctry>CA</Ctry>
<AdrLine>344 Avon Street</AdrLine>
</PstlAdr>
</Cdtr>
<CdtrAcct>
<Id>
<Othr>
<Id>04120728168</Id>
</Othr>
</Id>
<Tp>
<Cd>CASH</Cd>
</Tp>
</CdtrAcct>
</OrgnlTxRef>
</TxInfAndSts>
</OrgnlPmtInfAndSts>
</CstmrPmtStsRpt>
</Document>
OR
Sample Xml2的一部分:
<TxInfAndSts>
<OrgnlEndToEndId>TES000000001</OrgnlEndToEndId>
<TxSts>RJCT</TxSts>
<StsRsnInf>
<Orgtr>
<Id>
<OrgId>
<Othr>
<Id>TEST123</Id>
</Othr>
</OrgId>
</Id>
</Orgtr>
<Rsn>
<Prtry>TST01</Prtry>
</Rsn>
<AddtlInf>SAMPLE TEXT</AddtlInf>
</StsRsnInf>
XML可以包含<Cd>
或<Prtry>
,但不能同时包含 <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:iso="urn:iso:std:iso:20022:tech:xsd:pain.002.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" encoding="UTF-8"/>
.........
<xsl:template match="iso:TxInfAndSts">
<xsl:variable name="ReasonCd">
<xsl:choose>
<xsl:when test="iso:StsRsnInf/iso:Rsn/iso:Cd">
<xsl:value-of select="iso:StsRsnInf/iso:Rsn/iso:Cd"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="iso:StsRsnInf/iso:Rsn/iso:Prtry"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="string-length($ReasonCd) > 0 ">
<PMT_ACK_ERR class="R">
<PMT_ACK_FILE_ID/>
<PYMNT_REF_ID>
<xsl:apply-templates select="iso:OrgnlEndToEndId"/>
</PYMNT_REF_ID>
<SEQ_NUM>1</SEQ_NUM>
<ERROR_CODE>
<xsl:apply-templates select="$ReasonCd"/>
</ERROR_CODE>
<xsl:call-template name="iso:AddtlInf">
<xsl:with-param name="error_code">
<xsl:apply-templates select="$ReasonCd"/>
</xsl:with-param>
</xsl:call-template>
</PMT_ACK_ERR>
</xsl:if>
或ReasonCd
。
我正在尝试使用“选择”“何时”动态分配变量。下面提到了XSLT
{{1}}
但它不起作用。变量{{1}}未被分配。我使用在线XSLT转换器进行了测试,并在Peoplesoft Application Engine中运行。如果有其他方法可以分配变量,请告诉我。上面的代码段写在模板匹配标记上。
答案 0 :(得分:0)
正如其他人提到的,如果没有在模板中看到实际有效XML 以及变量声明的完整上下文,我们就无法帮助您。您很可能在上下文中遇到问题(这就是为什么$ReasonCd
没有按照需要分配的原因),但您当前也设置了逻辑,以便为$ReasonCd
分配相同的值,无论如何。在示例XML上尝试使用此模板,以查看:
<xsl:template match="//StsRsnInf">
<xsl:variable name="ReasonCd">
<xsl:choose>
<xsl:when test="Rsn/Cd">
<xsl:value-of select="Rsn/Cd"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'NotFound'"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select="$ReasonCd" /> - <xsl:value-of select="Rsn/Cd" />
</xsl:template>