XSLT:如何根据条件获取第一条记录

XSLT: How to get the first record based on condition

我是这个 XSLT 的新手,正在尝试修复一些问题 issue.Could 请您帮我解决这个问题。

实际上我有一个原始数据,其中包含有关扫描被拒绝文件的信息。每个被拒绝的项目都会记录信息。在原始数据的 3 个元素中,即 i)ScanRejected ii) ScanInitiated iii) CardSupplier。 我正在尝试处理这些原始数据并将其以格式化的方式放入 XML 中。每次处理每条记录时,如果我找到 <ScanRejected> 元素,那么我想访问 <CardSupplier> 元素以获取 CardNumber。这意味着我需要访问 ONLY 前一个 CardSupplier 元素。

在这种情况下,我需要获取卡号作为
<CardNumber t="String">##############0251</CardNumber> 没有 <CardNumber t="String">##############1111</CardNumber>

输入XML:

    <ScanRejected>
      <Validity t="String">NotValidated</Validity>
      <EventID t="String">ScanRejected</EventID>
    </ScanRejected>
    <ScanInitiated>
      <EventID t="String">ScanInitiated</EventID>
      <TransactionReference t="String"></TransactionReference>
    </ScanInitiated>
    <CardSupplier>
      <CardNumber t="String">##############0251</CardNumber>
      <CardPosition t="String">Inserted</CardPosition>
      <CardValid t="Boolean">True</CardValid>
      <EventID t="String">CardAccepted</EventID>
    </CardSupplier>
    <ScanRejected>
      <Validity t="String">NotSupported</Validity>
      <EventID t="String">ScanRejected</EventID>
    </ScanRejected>
    <ScanInitiated>
      <EventID t="String">ScanInitiated</EventID>
      <TransactionReference t="String"></TransactionReference>
    </ScanInitiated>
    <CardSupplier>
      <CardNumber t="String">##############1111</CardNumber>
      <CardPosition t="String">Inserted</CardPosition>
      <CardValid t="Boolean">True</CardValid>
      <EventID t="String">CardAccepted</EventID>
    </CardSupplier>
    <ScanRejected>
      <Validity t="String">NotScanned</Validity>
      <EventID t="String">ScanRejected</EventID>
    </ScanRejected>
    <ScanInitiated>
      <EventID t="String">ScanInitiated</EventID>
      <TransactionReference t="String"></TransactionReference>
    </ScanInitiated>
    <CardSupplier>
      <CardNumber t="String">##############2345</CardNumber>
      <CardPosition t="String">Inserted</CardPosition>
      <CardValid t="Boolean">True</CardValid>
      <EventID t="String">CardAccepted</EventID>
    </CardSupplier>

期望输出:

    -<Tran>
      <TranName>ScanRejected</TranName>
      <CardNumber>##############0251</CardNumber>
    </Tran>
    -<Tran>
      <TranName>ScanRejected</TranName>
      <CardNumber>##############1111</CardNumber>
    </Tran>
    -<Tran>
      <TranName>ScanRejected</TranName>
      <CardNumber>##############2345</CardNumber>
    </Tran>

** 我的 XSLT

<xsl:template name="ScanTemplate">
  <xsl:variable name="x" select ="Content/*[1]" />
  <Tran>
    <xsl:choose>
     <xsl:when test="$x/EventID='ScanRejected'">
        <TranName>ScanRejected</TranName>
      </xsl:when>
    </xsl:choose>
    <CardNumber> </CardNumber>
  </Tran>
</xsl:template>

我不知道你到目前为止尝试了什么,但类似的东西应该可以正常工作,至少给你一个线索来做你想做的事:

<!-- assuming the root element of the XML is "root" -->
<xsl:template match="root">
   <out>
    <xsl:apply-templates select="ScanRejected"/>
   </out>
</xsl:template>

<xsl:template match="ScanRejected">
    <Tran>
        <TranName>ScanRejected</TranName>
        <CardNumber><xsl:value-of select="preceding-sibling::CardSupplier[1]/CardNumber" /></CardNumber>
    </Tran>
</xsl:template>