【问题标题】:Dynamically assign a variable based on the Tag根据标签动态分配变量
【发布时间】: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&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>

部分示例 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 可以有&lt;Cd&gt;&lt;Prtry&gt;,但不能同时有。

我正在尝试使用“选择”“何时”动态分配变量。下面提到了 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


【解决方案1】:

正如其他人所提到的,如果不查看您的实际有效 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

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2021-01-07
    • 2015-02-05
    相关资源
    最近更新 更多