xsl 转换器以获取最高值

Posted

技术标签:

【中文标题】xsl 转换器以获取最高值【英文标题】:xsl transformer to fetch highest value 【发布时间】:2021-11-20 14:10:37 【问题描述】:

我有以下 XML 输入文件

<?xml version="1.0" encoding="UTF-8"?>
<ns3:oppgjor xmlns:ns3="http://NEXSTEP.Schemas.Kasseoppgjor" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes">
  <ROUTE_RECORD>
    <ns2:SENDER Sender_code="BO_SERVER"/>
    <ns2:RECEIPIENT Receipient_code="MASTER"/>
    <ns2:MESSAGE_ID Type_name="Bonger" Version_number="1.0"/>
  </ROUTE_RECORD>
  <MESSAGE_RECORD>
    <InsertChange>
      <id>fb920f1d-3d14-4f45-b142-1e6df39bf17e</id>
      <bruker>000821</bruker>
      <kasseId>T10</kasseId>
      <opprettetTidspunkt>2021-08-26T09:48:24.423+02:00</opprettetTidspunkt>
      <startBeholdning>1500</startBeholdning>
      <opptaltBeholdning>-4990</opptaltBeholdning>
      <beregnetBeholdning>988</beregnetBeholdning>
      <avdeling>0</avdeling>
      <lager>STA</lager>
      <bonger>
        <bong>T10-54</bong>
        <bong>T10-53</bong>
        <bong>T10-49</bong>
        <bong>T10-66</bong>
        <bong>T10-17</bong>
        <bong>T10-16</bong>
        <bong>T10-15</bong>
        <bong>T10-14</bong>
        <bong>T10-13</bong>
        <bong>T10-12</bong>
      </bonger>
    </InsertChange>
  </MESSAGE_RECORD>
</ns3:oppgjor>

我的输出应该如下

<?xml version="1.0" encoding="UTF-8"?>
<CASH_REGISTER_REPORT>
   <REFERENCE>66</REFERENCE>
</CASH_REGISTER_REPORT>

参考 66 应通过路径 MESSAGE_RECORD/InsertChange/bonger/bong 计算。这应该是“-”之后的值,并且应该取最高值。根据示例,它应该是 66。

T10-66 => 66

下面是我当前的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns3="http://NEXSTEP.Schemas.Kasseoppgjor" xmlns:ns2="http://NEXSTEP.Schemas.NexstepTypes" exclude-result-prefixes="ns2 ns3">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="*">
        <xsl:element name="name()" namespace="namespace-uri()">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="/ns3:oppgjor">
        <CASH_REGISTER_REPORT>
          <REFERENCE></REFERENCE>
        </CASH_REGISTER_REPORT>
    </xsl:template>
</xsl:stylesheet>

有没有办法轻松地将 MESSAGE_RECORD/InsertChange/bonger/bong 中的最高值获取到 REFERENCE?

干杯

【问题讨论】:

您使用的是哪种 XSLT 处理器?使用一些扩展函数可能会更简单。 【参考方案1】:

这是您可以查看的一种方式:

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns3="http://NEXSTEP.Schemas.Kasseoppgjor"
exclude-result-prefixes="ns3">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/ns3:oppgjor">
    <CASH_REGISTER_REPORT>
        <xsl:for-each select="MESSAGE_RECORD/InsertChange/bonger/bong">
            <xsl:sort select="substring-after(., '-')" data-type="number" order="descending"/>
            <xsl:if test="position()=1">
                <REFERENCE>
                    <xsl:value-of select="substring-after(., '-')"/>
                </REFERENCE>
            </xsl:if>
        </xsl:for-each>
    </CASH_REGISTER_REPORT>
</xsl:template>

</xsl:stylesheet>

【讨论】:

这非常有效。非常感谢@michael.hor257k

以上是关于xsl 转换器以获取最高值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSL 在 XML 转换中查找随机元素

转换前更新 XSL 文件

当输入 XML 和转换 XSL 是字符串时,如何使用 XslCompiledTransform。如何将转换结果作为字符串获取?

C# 中的 XSLT 转换 - 如何获取包含文档的有效 URL?

将 xsl:apply-templates 转换为字符串值以用作 if 参数

如何将带有嵌入图像的 XHTML+CSS 转换为 XSL-FO?