【问题标题】:How to select the maximum of a node in xslt?如何在xslt中选择一个节点的最大值?
【发布时间】:2020-12-15 16:31:13
【问题描述】:

我正在尝试使用 xslt 选择节点的最大值,但它不起作用。该节点是 zordaSupplierCode 它是一个字母数字,似乎 max 函数不适用于字母数字。我也尝试过排序,但我使用的 xslt 没有输出。

有没有办法在 XSLT 中选择字母数字的最大值?这里我最大的价值应该是R837。

提前致谢。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <object>
    <metadata>
      <schemaVersion>5</schemaVersion>
      <offset>415628</offset>
      <processId>53e7baec-c73f-46d6-874f-62433bf2fbc6</processId>
      <processDate>2020-11-25T01:50:39.997Z</processDate>
      <processApp>siriusPRT-uat</processApp>
      <version>1</version>
      <technicalId>05605578001906_PT_PT502410949</technicalId>
      <status>INTEGRATED</status>
      <group>pt</group>
    </metadata>
    <data>
      <tradeItemUnitDescriptorCode>BASE_UNIT_OR_EACH</tradeItemUnitDescriptorCode>
      <gtin>05605578001906</gtin>
      <additionalTradeItemIdentification>
        <additionalTradeItemIdentificationTypeCode>CUG</additionalTradeItemIdentificationTypeCode>
        <additionalTradeItemIdentificationValue>00141592</additionalTradeItemIdentificationValue>
      </additionalTradeItemIdentification>
      <additionalTradeItemIdentification>
        <additionalTradeItemIdentificationTypeCode>GTIN_12</additionalTradeItemIdentificationTypeCode>
        <additionalTradeItemIdentificationValue>560557800190</additionalTradeItemIdentificationValue>
      </additionalTradeItemIdentification>
      <additionalTradeItemIdentification>
        <additionalTradeItemIdentificationTypeCode>PLU</additionalTradeItemIdentificationTypeCode>
        <additionalTradeItemIdentificationValue>2880260000000</additionalTradeItemIdentificationValue>
      </additionalTradeItemIdentification>
      <zordaDedicatedInformation>
        <tradeItemStatus>A</tradeItemStatus>
        <zordaSupplyChain>
          <variant>
            <isMainSupplyChain>false</isMainSupplyChain>
          </variant>
          <zordaSupplierCode>R837</zordaSupplierCode>
          <zordaSupplierCode>P837</zordaSupplierCode>
          <zordaSupplierCode>B837</zordaSupplierCode>
        </zordaSupplyChain>
        <mainGtin>56035500010678</mainGtin>
        <cug>00141592</cug>
        <isMainGtin>true</isMainGtin>
        <countryOfRecordCountryCode>PT</countryOfRecordCountryCode>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>05</code>
          <hierarchyType>Product</hierarchyType>
          <level>1</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>05</concatenatedCode>
          <description>
            <pt>PF</pt>
          </description>
          <applicationDate>1996-10-15T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>0508</code>
          <hierarchyType>Product</hierarchyType>
          <level>2</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>050508</concatenatedCode>
          <description>
            <pt>FRUTAS E VERDURAS</pt>
          </description>
          <applicationDate>1996-10-15T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>050810</code>
          <hierarchyType>Product</hierarchyType>
          <level>3</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>050508050810</concatenatedCode>
          <description>
            <pt>CASTANHAS</pt>
          </description>
          <applicationDate>1996-10-15T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>05081001</code>
          <hierarchyType>Product</hierarchyType>
          <level>4</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>05050805081005081001</concatenatedCode>
          <description>
            <pt>CASTANHAS</pt>
          </description>
          <applicationDate>1996-10-15T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <isMainSupplier>false</isMainSupplier>
        <companyInternalIdentification>PT502410949</companyInternalIdentification>
        <isTradeItemAuchanBrand>false</isTradeItemAuchanBrand>
      </zordaDedicatedInformation>
      <isTradeItemAService>false</isTradeItemAService>
      <tradeItemSynchronisationDates>
        <effectiveDateTime>1996-10-15T00:00:00+02:00</effectiveDateTime>
        <discontinuedDateTime>2100-12-31T00:00:00+02:00</discontinuedDateTime>
        <lastChangeDateTime>2020-11-24T23:26:28+02:00</lastChangeDateTime>
      </tradeItemSynchronisationDates>
      <isTradeItemABaseUnit>true</isTradeItemABaseUnit>
      <isTradeItemADespatchUnit>false</isTradeItemADespatchUnit>
      <isTradeItemAConsumerUnit>true</isTradeItemAConsumerUnit>
      <tradeItemInformation>
        <extension>
          <variableTradeItemInformationModule>
            <variableTradeItemInformation>
              <variableTradeItemTypeCode>LOOSE</variableTradeItemTypeCode>
              <isTradeItemAVariableUnit>false</isTradeItemAVariableUnit>
            </variableTradeItemInformation>
          </variableTradeItemInformationModule>
          <deliveryPurchasingInformationModule>
            <deliveryPurchasingInformation>
              <endAvailabilityDateTime>2100-12-31T00:00:00+02:00</endAvailabilityDateTime>
              <orderingUnitOfMeasure>MM</orderingUnitOfMeasure>
            </deliveryPurchasingInformation>
          </deliveryPurchasingInformationModule>
          <dutyFeeTaxInformationModule>
            <dutyFeeTaxInformation>
              <dutyFeeTaxTypeCode>01</dutyFeeTaxTypeCode>
            </dutyFeeTaxInformation>
          </dutyFeeTaxInformationModule>
          <tradeItemMeasurementsModule>
            <tradeItemMeasurements>
              <tradeItemWeight>
                <grossWeight>
                  <measurementValue>0.001</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </grossWeight>
                <netWeight>
                  <measurementValue>1.0E-6</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </netWeight>
                <drainedWeight>
                  <measurementValue>1.0E-6</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </drainedWeight>
              </tradeItemWeight>
              <netContent>
                <measurementValue>0</measurementValue>
                <measurementUnitCode>EA</measurementUnitCode>
              </netContent>
            </tradeItemMeasurements>
          </tradeItemMeasurementsModule>
          <salesInformationModule>
            <salesInformation>
              <priceComparisonMeasurement>
                <measurementValue>1</measurementValue>
                <measurementUnitCode>GRM</measurementUnitCode>
              </priceComparisonMeasurement>
              <sellingUnitOfMeasure>EA</sellingUnitOfMeasure>
            </salesInformation>
          </salesInformationModule>
          <tradeItemDescriptionModule>
            <tradeItemDescriptionInformation>
              <tradeItemDescription>
                <pt>CASTANHA 50/60:1KG </pt>
              </tradeItemDescription>
              <brandNameInformation>null</brandNameInformation>
            </tradeItemDescriptionInformation>
          </tradeItemDescriptionModule>
          <placeOfItemActivityModule>
            <placeOfProductActivity>
              <productActivityDetails>
                <productActivityTypeCode>LAST_PROCESSING</productActivityTypeCode>
              </productActivityDetails>
              <countryOfOriginStatement>
                <pt>Portugal</pt>
              </countryOfOriginStatement>
              <countryOfOrigin>
                <countryCode>620</countryCode>
              </countryOfOrigin>
            </placeOfProductActivity>
          </placeOfItemActivityModule>
          <packagingMarkingModule>
            <packagingMarking>
              <isPriceOnPack>false</isPriceOnPack>
              <hasBatchNumber>false</hasBatchNumber>
            </packagingMarking>
          </packagingMarkingModule>
        </extension>
      </tradeItemInformation>
    </data>
  </object>
</root>
<?xml version="1.0" encoding="UTF-8"?>

<!--Changelog :
0.1.0 @SJA : Initial verision
-->

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:param name="country" select="pt"/>
<xsl:param name="IsPrimaryOne" select="1"/>
<xsl:param name="IsPrimaryTwo" select="0"/>


<xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
    
        <xsl:for-each select="root/object/data/additionalTradeItemIdentification/additionalTradeItemIdentificationTypeCode">
        <xsl:if test="contains(.,'GTIN_')">
        
            <ProductCode><xsl:value-of select="../../zordaDedicatedInformation/cug"/></ProductCode>
            <Delimited>;</Delimited>
            <xsl:choose>
                <xsl:when test="../../zordaDedicatedInformation/zordaSupplyChain/variant/isMainSupplyChain/text()='true'">
                    <SupplierCode><xsl:value-of select="../../zordaDedicatedInformation/zordaSupplyChain/zordaSupplierCode"/></SupplierCode>
                </xsl:when>
                <xsl:otherwise>
                    <SupplierCode><xsl:value-of select="max(../../zordaDedicatedInformation/zordaSupplyChain/zordaSupplierCode)"/></SupplierCode>
                </xsl:otherwise>
            </xsl:choose>
            <Delimited>;</Delimited>
            <EanCode><xsl:value-of select="../additionalTradeItemIdentificationValue"/></EanCode>
            <Delimited>;</Delimited>
            <xsl:choose>
                <xsl:when test="../../zordaDedicatedInformation/isMainGtin/text()='true'">
                    <IsPrimary><xsl:value-of select="$IsPrimaryOne"/></IsPrimary>
                </xsl:when>
                <xsl:otherwise>
                    <IsPrimary><xsl:value-of select="$IsPrimaryTwo"/></IsPrimary>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:if test="position() != last()"><xsl:text>&#10;</xsl:text></xsl:if>     
        </xsl:if>           
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

【问题讨论】:

标签: xml xslt xpath


【解决方案1】:

您断言max() 函数不适用于字母数字值是不正确的。但是,XSLT 处理器需要知道比较值的数据类型。

考虑以下最小化的示例:

XML

<input>
    <item>R837</item>
    <item>P837</item>
    <item>B837</item>
</input>

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:template match="/input">
   <max>
        <xsl:value-of select="max(item/string())"/>
   </max>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<max>R837</max>

请注意,结果可能取决于所使用的collation

【讨论】:

  • 详细说明,max() 的默认设置是,如果输入没有类型,函数会尝试将其视为数字。这就是本例中需要调用string() 的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多