Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在XSLT中只选择节点中的一个元素?_Xml_Xslt_Xpath 2.0 - Fatal编程技术网

Xml 如何在XSLT中只选择节点中的一个元素?

Xml 如何在XSLT中只选择节点中的一个元素?,xml,xslt,xpath-2.0,Xml,Xslt,Xpath 2.0,我想用XSLT只选择一个代码元素(具有最大级别值),但它不起作用 <?xml version="1.0" encoding="UTF-8"?> <root> <object> <metadata> <schemaVersion>54</schemaVersion> <offset>13058626</offset>

我想用XSLT只选择一个代码元素(具有最大级别值),但它不起作用

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <object>
    <metadata>
      <schemaVersion>54</schemaVersion>
      <offset>13058626</offset>
      <processId>9f151cd9-7039-4b1a-99de-8336c75f5f28</processId>
      <processDate>2020-11-03T12:31:33.239Z</processDate>
      <processApp>siriusPRT-uat</processApp>
      <version>1</version>
      <technicalId>24000098295098_PT_PT508012040</technicalId>
      <status>INTEGRATED</status>
      <group>pt</group>
    </metadata>
    <data>
      <tradeItemUnitDescriptorCode>BASE_UNIT_OR_EACH</tradeItemUnitDescriptorCode>
      <gtin>24000098295098</gtin>
      <additionalTradeItemIdentification>
        <additionalTradeItemIdentificationTypeCode>CUG</additionalTradeItemIdentificationTypeCode>
        <additionalTradeItemIdentificationValue>00982950</additionalTradeItemIdentificationValue>
      </additionalTradeItemIdentification>
      <additionalTradeItemIdentification>
        <additionalTradeItemIdentificationTypeCode>GTIN_13</additionalTradeItemIdentificationTypeCode>
        <additionalTradeItemIdentificationValue>2400009829509</additionalTradeItemIdentificationValue>
      </additionalTradeItemIdentification>
      <zordaDedicatedInformation>
        <tradeItemStatus>A</tradeItemStatus>
        <zordaSupplyChain>
          <zordaSupplierCode>Q370</zordaSupplierCode>
        </zordaSupplyChain>
        <mainGtin>-1</mainGtin>
        <cug>00982950</cug>
        <isMainGtin>false</isMainGtin>
        <countryOfRecordCountryCode>PT</countryOfRecordCountryCode>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>08</code>
          <hierarchyType>Product</hierarchyType>
          <level>1</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>08</concatenatedCode>
          <description>
            <pt>ADMISTRATIVOS</pt>
          </description>
          <applicationDate>2010-06-23T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>0888</code>
          <hierarchyType>Product</hierarchyType>
          <level>2</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>080888</concatenatedCode>
          <description>
            <pt>REC. PAGTº P/ ENTIDADES EXTERN</pt>
          </description>
          <applicationDate>2010-06-23T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>088802</code>
          <hierarchyType>Product</hierarchyType>
          <level>3</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>080888088802</concatenatedCode>
          <description>
            <pt>ENTIDADE EXTERNA NSBE</pt>
          </description>
          <applicationDate>2010-06-23T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <zordaClassification>
          <groupingCode>PT</groupingCode>
          <code>08880202</code>
          <hierarchyType>Product</hierarchyType>
          <level>4</level>
          <variantCode>PT</variantCode>
          <hierarchyCode>REF</hierarchyCode>
          <concatenatedCode>08088808880208880202</concatenatedCode>
          <description>
            <pt>CONSULTAS DE ESTéTICA</pt>
          </description>
          <applicationDate>2010-06-23T00:00:00+02:00</applicationDate>
        </zordaClassification>
        <isMainSupplier>false</isMainSupplier>
        <companyInternalIdentification>PT508012040</companyInternalIdentification>
        <isTradeItemAuchanBrand>false</isTradeItemAuchanBrand>
      </zordaDedicatedInformation>
      <isTradeItemAService>false</isTradeItemAService>
      <tradeItemSynchronisationDates>
        <effectiveDateTime>2010-06-23T00:00:00+02:00</effectiveDateTime>
        <discontinuedDateTime>2100-12-31T00:00:00+02:00</discontinuedDateTime>
        <lastChangeDateTime>2020-11-03T12:17:06+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>03</dutyFeeTaxTypeCode>
            </dutyFeeTaxInformation>
          </dutyFeeTaxInformationModule>
          <tradeItemMeasurementsModule>
            <tradeItemMeasurements>
              <tradeItemWeight>
                <grossWeight>
                  <measurementValue>0</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </grossWeight>
                <netWeight>
                  <measurementValue>0</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </netWeight>
                <drainedWeight>
                  <measurementValue>0</measurementValue>
                  <measurementUnitCode>KGM</measurementUnitCode>
                </drainedWeight>
              </tradeItemWeight>
              <netContent>
                <measurementValue>0</measurementValue>
                <measurementUnitCode>EA</measurementUnitCode>
              </netContent>
            </tradeItemMeasurements>
          </tradeItemMeasurementsModule>
          <salesInformationModule>
            <salesInformation>
              <priceComparisonMeasurement>
                <measurementValue>0</measurementValue>
                <measurementUnitCode>GRM</measurementUnitCode>
              </priceComparisonMeasurement>
              <sellingUnitOfMeasure>EA</sellingUnitOfMeasure>
            </salesInformation>
          </salesInformationModule>
          <tradeItemDescriptionModule>
            <tradeItemDescriptionInformation>
              <tradeItemDescription>
                <pt>HOMEM ABDOMEN 60 MIN </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>
我尝试使用排序,但没有得到我想要的输出(没有打印任何内容,我只需要一个输出,即具有最高级别的代码)

我也尝试使用max函数,但它提供了多个输出。我是XSLT和xpath的初学者,所以我可能使用了错误的函数

下面是我的XSLT代码:

<?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="NomenclatureCode" select="1"/>


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

    <xsl:template match="/">
        <xsl:for-each select="root/object/data/zordaDedicatedInformation/zordaClassification">
            <xsl:sort select="level" order="ascending"/>
            <ProductCode><xsl:value-of select="../cug"/></ProductCode>
            <Delimited>;</Delimited>
            <NomenclatureCode><xsl:value-of select="$NomenclatureCode"/></NomenclatureCode>
            <Delimited>;</Delimited>
                <xsl:if test="code/position() = last()">
                    <ElementCode><xsl:value-of select="code"/></ElementCode>
                </xsl:if>
                <Delimited>;</Delimited>
            <xsl:if test="position() != last()"><xsl:text>&#10;</xsl:text></xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>


;
;
;



我不知道您需要哪种输出,但这会选择您要查找的值:

XSLT2.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:variable name="maxLevel" select="max(root/object/data/zordaDedicatedInformation/zordaClassification/level)"/>
    <xsl:value-of select="root/object/data/zordaDedicatedInformation/zordaClassification[level=$maxLevel]/code"/>
  </xsl:template>
  
</xsl:stylesheet>

XSLT1.0

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:variable name="levelMax">
        <xsl:for-each select="root/object/data/zordaDedicatedInformation/zordaClassification">
            <xsl:sort select="level" order="descending"/>
            <xsl:if test="position() = 1">
                <xsl:value-of select="level"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    
    <xsl:apply-templates select="root/object/data/zordaDedicatedInformation/zordaClassification[level=$levelMax]"/>
    
  </xsl:template>
  
  <xsl:template match="zordaClassification">
      <xsl:value-of select="code"/>
      <xsl:text>&#xa;</xsl:text> <!-- NewLine -->
  </xsl:template>
  
</xsl:stylesheet>

查看此处的工作情况:

要找到您可以使用的最大代码元素:max(root/object/data/zordadeindicatedinformation/zordaClassification/code)我需要找到最大级别,并获取关联代码的值是否有联系?如果是,结果应该是什么?平局是什么意思?两个或多个具有相同级别的代码。这正是我需要的输出,但当我在xslt中使用时,它不起作用…您的xslt引擎支持xslt 2.0或更高版本吗?你用的是哪种发动机?max()在XPath/XSLT 1中不可用。您的代码可以工作,但如果我有多个/data/I,我只有position()=1的第一行,并且我需要x行…@soufiane请参阅我上面的答案(XSLT 1.0解决方案)中的更新。您以非常优雅的方式完成了:)