从XML数据中获取正确的数据(使用XSLT)

问题描述 投票:0回答:2

我希望从多个节点中获取数据,但我很难找到一种方法让它按照我想要的方式工作。

样本数据:

<Records>
  <Record>
    <ID>100</ID>
    <LatestStep>(Offers:1)=9;(Offers:2)=10;(Offers:3)=7</LatestStep>
    <OfferAmount>(Offers:1)=90000.0;(Offers:2)=77000.0;(Offers:3)=75999.0</OfferAmount>
    <StartDate>(Offers:1)=04/24/2019;(Offers:2)=04/26/2019;(Offers:3)=04/28/2019</StartDate>
    <OfferAmount>(Offers:1)=90000.0;(Offers:2)=77000.0;</OfferAmount>
  </Record>
<Records>

我希望能够从OfferAmount字段以及StartDate的04/26/2019中获取77000.0。我需要在XSLT中创建的逻辑是在LatestStep中找到Offer的最新步骤10。然后,在等号后抓取数据。

    <!-- Current Code (example) -->
    <xsl:variable name="record" select="."/>
    <xsl:variable name="offers">
        <xsl:analyze-string select="LatestStep"regex="\(Offers:([\d]+)\)=10">
            <xsl:matching-substring>
                <offer>
                    <payAmount>
                        <xsl:value of select="tokenize(replace($record/OfferAmount, '\(Offers:[\d]+\)=',''),';')
                    </payAmount>
                </offer>
xml xslt xpath xslt-1.0 xslt-2.0
2个回答
0
投票

有了这种数据,通常可以在多个阶段解决这个问题。第一阶段:将其转换为结构化XML,这种XML首先应该首先给出;第二阶段,抓住你需要的实际数据。

原因是第一阶段通常是可重复使用的;您可以对数据应用相同的预处理,无论您以后想要如何处理它。

我不知道实际的数据模型是什么,或者你在输入的其他例子中可能会发现什么,但如果你想转向

<StartDate>(Offers:1)=04/24/2019;(Offers:2)=04/26/2019;(Offers:3)=04/28/2019</StartDate>

<StartDate>
  <Offers nr="1">2019-04-24</Offers>
  <Offers nr="2">2019-04-26</Offers>
  <Offers nr="3">2019-04-28</Offers>
</StartDate>

然后你可以这样做

<xsl:template match="StartDate|...">
  <xsl:copy>
    <xsl:for-each select="tokenize(., ';')">
      <Offers nr="{position()}>
        <xsl:value-of select="my:us-date-to-iso(substring-after(., '='))"/>
      </Offers>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

其中my:us-date-to-iso以通常的方式将美国(mm / dd / yyyy)日期转换为ISO格式。

然后第二阶段变得微不足道。


0
投票

要提取日期,您可以使用:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="Record">
    <xsl:variable name="prefix" select="substring-before(tokenize(LatestStep, ';')[ends-with(., '=10')], '=10')" />
     <offer>
        <date>
             <xsl:value-of select="substring-after(tokenize(StartDate, ';')[starts-with(., $prefix)], concat($prefix, '='))" />
        </date>
    </offer>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.