首页 > 解决方案 > 如何根据 xslt 的元素是否存在来选择值

问题描述

我正在为我们的银行集成设置一个 xslt 转换,我需要根据另一个元素是否存在来更改一个元素的值。

我可以使用以下默认值

<xsl:template  match="wdt:Document/wdt:CstmrCdtTrfInitn/wdt:PmtInf/wdt:CdtTrfTxInf/wdt:RmtInf/wdt:Strd/wdt:RfrdDocInf/wdt:Tp/wdt:CdOrPrtry/wdt:Cd" priority="3">
        <xsl:text>CINV</xsl:text>
</xsl:template>

当我尝试这个时:

<xsl:template match="wdt:Document/wdt:CstmrCdtTrfInitn/wdt:PmtInf/wdt:CdtTrfTxInf/wdt:RmtInf/wdt:Strd/wdt:RfrdDocInf/wdt:Tp/wdt:CdOrPrtry/wdt:Cd" priority="4">
  <xsl:if test="*[local-name()='CdtNoteAmt']">
   <xsl:value-of select="CREN"/>
  </xsl:if>
 </xsl:template>

我得到一个错误。

我的 xml 看起来像这样:

<RmtInf>
               <Strd>
                  <RfrdDocInf>
                     <Tp>
                        <CdOrPrtry>
                           <Cd>SOAC</Cd>
                        </CdOrPrtry>
                     </Tp>
                     <Nb>CS82001LF</Nb>
                     <RltdDt>2019-08-20</RltdDt>
                  </RfrdDocInf>
                  <RfrdDocAmt>
                     <DuePyblAmt Ccy="USD">820.01</DuePyblAmt>
                     <RmtdAmt Ccy="USD">820.01</RmtdAmt>
                  </RfrdDocAmt>
                  <CdtrRefInf>
                     <Ref>CS82001LF</Ref>
                  </CdtrRefInf>
               </Strd>
               <Strd>
                  <RfrdDocInf>
                     <Tp>
                        <CdOrPrtry>
                           <Cd>SOAC</Cd>
                        </CdOrPrtry>
                     </Tp>
                     <Nb>CS-CrNote82001</Nb>
                     <RltdDt>2019-08-20</RltdDt>
                  </RfrdDocInf>
                  <RfrdDocAmt>
                     <CdtNoteAmt Ccy="USD">50</CdtNoteAmt>
                  </RfrdDocAmt>
                  <CdtrRefInf>
                     <Ref>CS-CrNote82001</Ref>
                  </CdtrRefInf>
               </Strd>
            </RmtInf>

我需要以下元素具有 CINV 或 CREN 值,具体取决于 CdtNoteAmt 元素是否存在:

<Tp>
    <CdOrPrtry>
        <Cd>CINV</Cd>
    </CdOrPrtry>
</Tp>

标签: xmlxslt

解决方案


如果您想检查CdtNoteAmtXML 中的任何位置是否存在,您可以这样做...

<xsl:if test="//*[local-name()='CdtNoteAmt']">

或者更好的是,因为您似乎在处理已知的名称空间,您可以这样做......

<xsl:if test="//wdt:CdtNoteAmt">

另一方面,如果要检查是否CdtNoteAmt存在Strd与当前Cd元素所在的相同,请执行此操作...

<xsl:if test="ancestor::wdt:Strd//*[local-name()='CdtNoteAmt']">

或这个...

<xsl:if test="ancestor::wdt:Strd//wdt:CdtNoteAmt">

请注意,要按字面意思输出“CERN”,您需要这样做,否则您将尝试输出名为“CERN”的元素的内容

<xsl:value-of select="'CREN'"/>

或者这样做

<xsl:text>CERN</xsl:text>

推荐阅读