根据Tag动态分配变量

时间:2016-02-15 11:36:34

标签: xml xslt xslt-1.0 xslt-2.0 peoplesoft

我们提供的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&apos;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&apos;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中运行。如果有其他方法可以分配变量,请告诉我。上面的代码段写在模板匹配标记上。

1 个答案:

答案 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>

http://xsltransform.net/ncdD7mX