我希望从多个节点中获取数据,但我很难找到一种方法让它按照我想要的方式工作。
样本数据:
<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,这种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格式。
然后第二阶段变得微不足道。
要提取日期,您可以使用:
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>