【发布时间】:2016-02-15 11:36:34
【问题描述】:
我们接收的 XML 可以在 <Rsn> 标记内包含 <Cd> 或 <Prtry> 标记。我需要一种方法来获取任一标签内的值。下面给出了示例 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>
或
部分示例 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>,但不能同时有。
我正在尝试使用“选择”“何时”动态分配变量。下面提到了 XSLT 部分
<?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 没有被分配。我使用 Online XSLT 转换器进行了测试,并且还在 Peoplesoft Application Engine 中运行。请让我知道是否有任何替代方法来分配变量。上面的代码 sn -p 是写在模板匹配标签上的。
【问题讨论】:
-
您的 XML 没有名称空间,但您的 XSLT 的 XPath 表达式有。怎么会这样?
-
"变量 ReasonCd 没有被赋值。" 恐怕你搞错了。变量 is 被赋值。在别处寻找真正的问题。
标签: xml xslt xslt-1.0 xslt-2.0 peoplesoft