#xml #xslt
Вопрос:
У меня есть XML-документ, который выглядит следующим образом
<?xml version='1.0' encoding='UTF-8'?>
<STA_ORDERS>
<STA_ORDER_LINES>
<STA_ORDER_LINE>
<ADDITIONAL_COST_AMOUNT>0.0</ADDITIONAL_COST_AMOUNT>
<BRAND_NAME>Test</BRAND_NAME>
<BUY_QUANTITY_DUE>2.0</BUY_QUANTITY_DUE>
<BUY_UNIT_MEASURE>PCE</BUY_UNIT_MEASURE>
<CARD_PRICE_SE>0.0</CARD_PRICE_SE>
<CONV_FACTOR>1</CONV_FACTOR>
<CURRENCY_CODE>SEK</CURRENCY_CODE>
<CURRENCY_RATE>1.0</CURRENCY_RATE>
<CUSTOMER_UNIT_MEASURE>pcs</CUSTOMER_UNIT_MEASURE>
<DISCOUNT>0.0</DISCOUNT>
<ORDER_LINE_NO>1</ORDER_LINE_NO>
<PART_DESCRIPTION>SHEENA JKT OLIVE L</PART_DESCRIPTION>
<PART_NO>010008002010</PART_NO>
<PLANNED_DELIVERY_DATE>2021-07-02</PLANNED_DELIVERY_DATE>
<PREFERRED_RETAIL_PRICE_SE>0.0</PREFERRED_RETAIL_PRICE_SE>
<PRICE_CONVERSION_FACTOR>1</PRICE_CONVERSION_FACTOR>
<PRICE_UNIT_MEASURE>pcs</PRICE_UNIT_MEASURE>
<RELEASE_NO>3</RELEASE_NO>
<SHIPMENT_PARTIAL>CP</SHIPMENT_PARTIAL>
<UNIT_PRICE_IN_OUR_CURRENCY>1073.4</UNIT_PRICE_IN_OUR_CURRENCY>
<UNIT_PRICE_IN_SUPPLIER_CURRENCY>1073.4</UNIT_PRICE_IN_SUPPLIER_CURRENCY>
<VENDOR_PART_NO>010008002010</VENDOR_PART_NO>
</STA_ORDER_LINE>
</STA_ORDER_LINES>
</STA_ORDERS>
Мне нужен документ XSL для передачи вышеуказанного xml, чтобы <RELEASE_NO> имел начальный ноль, если номер выпуска содержит только одну цифру.
Пример 3 => 03, 2 =>> 02, 10 =>>> 10 (10 уже есть 2 цифры, так что мы просто оставим все как есть)
Я использовал приведенный ниже xsl.
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:ifs="urn:ifsworld-com:schemas:TYPE_SCHEMA_NAME_HERE" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" version="1.0" exclude-result-prefixes="ifs date">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="STA_ORDER_LINE">
<xsl:choose>
<xsl:when test="(RELEASE_NO > 9)">
<xsl:apply-templates select="@*|node()" />
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()" />
<RELEASE_NO>
<xsl:value-of select="concat('0',RELEASE_NO)"/>
</RELEASE_NO>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
но, похоже, работает неправильно, так как он добавил новый тег с исправлением, но более старый, похоже, все еще доступен. (https://www.freeformatter.com/xsl-transformer.html)
Есть какие-нибудь идеи??
===============================
Пересмотренный XML, похоже, не работает. Я добавил xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» xmlns=»urn:ifsworld-com:schemas:outbound_distribution_transactions_sta_send_purchase_order_sta_request» к тегу <STA_ORDERS>. Есть идеи, почему это не работает??
<?xml version='1.0' encoding='UTF-8'?>
<STA_ORDERS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:ifsworld-com:schemas:outbound_distribution_transactions_sta_send_purchase_order_sta_request">
<ACTIONTYPE>CREATE</ACTIONTYPE>
<BUYER>IFS APPLICATIONS</BUYER>
<COUNTRY_CODE>SE</COUNTRY_CODE>
<CURRENCY_CODE>SEK</CURRENCY_CODE>
<CUSTOMER_COMPANY_COUNTRY>SVERIGE</CUSTOMER_COMPANY_COUNTRY>
<CUSTOMER_COMPANY_NAME>Stadium Sverige AB</CUSTOMER_COMPANY_NAME>
<CUSTOMER_POSTAL_ADDRESS>Norra Promenaden,,602 22 Norrköping,,SVERIGE</CUSTOMER_POSTAL_ADDRESS>
<DELIVERY_TERMS_CODE>DPC</DELIVERY_TERMS_CODE>
<DELIVERY_TERMS_DESCRIPTION>023 DDP Norrköping CWH</DELIVERY_TERMS_DESCRIPTION>
<EAN_LOCATION_DELIVERY_ADDRESS>7350031681995</EAN_LOCATION_DELIVERY_ADDRESS>
<EAN_SUPPLIER_DOCUMENT_ADDRESS>EMCAT1</EAN_SUPPLIER_DOCUMENT_ADDRESS>
<FUNCTION_CODE>4</FUNCTION_CODE>
<ORDER_DATE>2021-07-02</ORDER_DATE>
<ORDER_NO>949</ORDER_NO>
<ORDER_REVISION>0</ORDER_REVISION>
<PAY_TERM_DAYS> Da</PAY_TERM_DAYS>
<PAY_TERM_DESCRIPTION>20 Days Net</PAY_TERM_DESCRIPTION>
<PAY_TERM_PERIOD>D</PAY_TERM_PERIOD>
<PAY_TERM_REFERENCE>e</PAY_TERM_REFERENCE>
<RECEIVER_COMMUNICATION_ID>CONNECT</RECEIVER_COMMUNICATION_ID>
<SENDER_COMMUNICATION_ID>S17647</SENDER_COMMUNICATION_ID>
<SHIP_VIA_DESCRIPTION>Car</SHIP_VIA_DESCRIPTION>
<SUPPLIER_ADDRESS_NO>1</SUPPLIER_ADDRESS_NO>
<TAXATION_NO>SE556236439701</TAXATION_NO>
<VENDOR_NO>90054</VENDOR_NO>
<WANTED_DELIVERY_DATE>2021-07-02</WANTED_DELIVERY_DATE>
<DEPARTMENT_ID>33</DEPARTMENT_ID>
<CHANGE>SENT</CHANGE>
<STA_DELIVER_TO>
<STA_ORDER_ADDRESS>
<ADDRESS_1>Ströbogatan 5</ADDRESS_1>
<CITY>NORRKÖPING</CITY>
<COUNTRY>SVERIGE</COUNTRY>
<RECEIVER_NAME>DC Stadium</RECEIVER_NAME>
<ZIP_CODE>602 23</ZIP_CODE>
</STA_ORDER_ADDRESS>
</STA_DELIVER_TO>
<STA_ORDER_LINES>
<STA_ORDER_LINE>
<ADDITIONAL_COST_AMOUNT>0.0</ADDITIONAL_COST_AMOUNT>
<BRAND_NAME>Test</BRAND_NAME>
<BUY_QUANTITY_DUE>2.0</BUY_QUANTITY_DUE>
<BUY_UNIT_MEASURE>PCE</BUY_UNIT_MEASURE>
<CARD_PRICE_SE>0.0</CARD_PRICE_SE>
<CONV_FACTOR>1</CONV_FACTOR>
<CURRENCY_CODE>SEK</CURRENCY_CODE>
<CURRENCY_RATE>1.0</CURRENCY_RATE>
<CUSTOMER_UNIT_MEASURE>pcs</CUSTOMER_UNIT_MEASURE>
<DISCOUNT>0.0</DISCOUNT>
<ORDER_LINE_NO>1</ORDER_LINE_NO>
<PART_DESCRIPTION>SHEENA JKT OLIVE L</PART_DESCRIPTION>
<PART_NO>010008002010</PART_NO>
<PLANNED_DELIVERY_DATE>2021-07-02</PLANNED_DELIVERY_DATE>
<PREFERRED_RETAIL_PRICE_SE>0.0</PREFERRED_RETAIL_PRICE_SE>
<PRICE_CONVERSION_FACTOR>1</PRICE_CONVERSION_FACTOR>
<PRICE_UNIT_MEASURE>pcs</PRICE_UNIT_MEASURE>
<RELEASE_NO>1</RELEASE_NO>
<SHIPMENT_PARTIAL>CP</SHIPMENT_PARTIAL>
<UNIT_PRICE_IN_OUR_CURRENCY>1073.4</UNIT_PRICE_IN_OUR_CURRENCY>
<UNIT_PRICE_IN_SUPPLIER_CURRENCY>1073.4</UNIT_PRICE_IN_SUPPLIER_CURRENCY>
<VENDOR_PART_NO>010008002010</VENDOR_PART_NO>
</STA_ORDER_LINE>
<STA_ORDER_LINE>
<ADDITIONAL_COST_AMOUNT>0.0</ADDITIONAL_COST_AMOUNT>
<BRAND_NAME>Test</BRAND_NAME>
<BUY_QUANTITY_DUE>2.0</BUY_QUANTITY_DUE>
<BUY_UNIT_MEASURE>PCE</BUY_UNIT_MEASURE>
<CARD_PRICE_SE>0.0</CARD_PRICE_SE>
<CONV_FACTOR>1</CONV_FACTOR>
<CURRENCY_CODE>SEK</CURRENCY_CODE>
<CURRENCY_RATE>1.0</CURRENCY_RATE>
<CUSTOMER_UNIT_MEASURE>pcs</CUSTOMER_UNIT_MEASURE>
<DISCOUNT>0.0</DISCOUNT>
<ORDER_LINE_NO>1</ORDER_LINE_NO>
<PART_DESCRIPTION>SHEENA JKT OLIVE L</PART_DESCRIPTION>
<PART_NO>010008002010</PART_NO>
<PLANNED_DELIVERY_DATE>2021-07-02</PLANNED_DELIVERY_DATE>
<PREFERRED_RETAIL_PRICE_SE>0.0</PREFERRED_RETAIL_PRICE_SE>
<PRICE_CONVERSION_FACTOR>1</PRICE_CONVERSION_FACTOR>
<PRICE_UNIT_MEASURE>pcs</PRICE_UNIT_MEASURE>
<RELEASE_NO>2</RELEASE_NO>
<SHIPMENT_PARTIAL>CP</SHIPMENT_PARTIAL>
<UNIT_PRICE_IN_OUR_CURRENCY>1073.4</UNIT_PRICE_IN_OUR_CURRENCY>
<UNIT_PRICE_IN_SUPPLIER_CURRENCY>1073.4</UNIT_PRICE_IN_SUPPLIER_CURRENCY>
<VENDOR_PART_NO>010008002010</VENDOR_PART_NO>
</STA_ORDER_LINE>
<STA_ORDER_LINE>
<ADDITIONAL_COST_AMOUNT>0.0</ADDITIONAL_COST_AMOUNT>
<BRAND_NAME>Test</BRAND_NAME>
<BUY_QUANTITY_DUE>1.0</BUY_QUANTITY_DUE>
<BUY_UNIT_MEASURE>PCE</BUY_UNIT_MEASURE>
<CARD_PRICE_SE>0.0</CARD_PRICE_SE>
<CONV_FACTOR>1</CONV_FACTOR>
<CURRENCY_CODE>SEK</CURRENCY_CODE>
<CURRENCY_RATE>1.0</CURRENCY_RATE>
<CUSTOMER_UNIT_MEASURE>pcs</CUSTOMER_UNIT_MEASURE>
<DISCOUNT>0.0</DISCOUNT>
<ORDER_LINE_NO>1</ORDER_LINE_NO>
<PART_DESCRIPTION>SHEENA JKT OLIVE L</PART_DESCRIPTION>
<PART_NO>010008002010</PART_NO>
<PLANNED_DELIVERY_DATE>2021-07-02</PLANNED_DELIVERY_DATE>
<PREFERRED_RETAIL_PRICE_SE>0.0</PREFERRED_RETAIL_PRICE_SE>
<PRICE_CONVERSION_FACTOR>1</PRICE_CONVERSION_FACTOR>
<PRICE_UNIT_MEASURE>pcs</PRICE_UNIT_MEASURE>
<RELEASE_NO>3</RELEASE_NO>
<SHIPMENT_PARTIAL>CP</SHIPMENT_PARTIAL>
<UNIT_PRICE_IN_OUR_CURRENCY>1073.4</UNIT_PRICE_IN_OUR_CURRENCY>
<UNIT_PRICE_IN_SUPPLIER_CURRENCY>1073.4</UNIT_PRICE_IN_SUPPLIER_CURRENCY>
<VENDOR_PART_NO>010008002010</VENDOR_PART_NO>
</STA_ORDER_LINE>
</STA_ORDER_LINES>
</STA_ORDERS>
Ответ №1:
Пожалуйста, попробуйте следующий XSLT.
Он учитывает пространство имен по умолчанию.
XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="urn:ifsworld-com:schemas:outbound_distribution_transactions_sta_send_purchase_order_sta_request">
<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ns1:RELEASE_NO[string-length() = 1]">
<xsl:copy>
<xsl:value-of select="concat('0', .)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. Огромное спасибо. Это работает идеально. Вы действительно спасаете жизнь 😀
2. Пересмотренный XML, похоже, не работает. Я добавил только ниже xmlns:xsi=» w3.org/2001/XMLSchema-instance » xmlns=»urn:ifsworld-com:schemas:outbound_distribution_transactions_sta_send_purchase_order_sta_request» к тегу <STA_ORDERS>. Есть идеи, почему это не работает??
3. @ShankaSomasiri, я обновил ответ, чтобы учесть добавленные пространства имен. Никогда не опускайте пространства имен из XML-документов.
4. Спасибо. Я буду иметь это в виду. Я немного новичок в XSL, я высоко ценю вашу помощь
Ответ №2:
Ниже работало на меня:
<xsl:choose>
<xsl:when test='/STA_ORDERS/STA_ORDER_LINES/STA_ORDER_LINE/RELEASE_NO amp;> 9'>
<RELEASE_NO>
<xsl:value-of select="/STA_ORDERS/STA_ORDER_LINES/STA_ORDER_LINE/RELEASE_NO"/>
</RELEASE_NO>
</xsl:when>
<xsl:otherwise>
<RELEASE_NO>
<xsl:value-of select="concat('0',/STA_ORDERS/STA_ORDER_LINES/STA_ORDER_LINE/RELEASE_NO)"/>
</RELEASE_NO>
</xsl:otherwise>
</xsl:choose>
Ответ №3:
Это не удалось, потому что вы обрабатываете содержимое дважды, один раз с помощью xsl:значение и один раз с помощью apply-templates
<xsl:apply-templates select="@*|node()" />
<RELEASE_NO>
<xsl:value-of select="concat('0',RELEASE_NO)"/>
</RELEASE_NO>
Но есть гораздо более чистые способы сделать это. Ицхак показал вам один из них; можно было бы использовать format-number(RELEASE_NO, '00')
другой; другой (довольно хитрый) способ substring(string(RELEASE_NO 100)), 2)
.
Комментарии:
1. Спасибо, Майкл. Любые идеи по пересмотренному XML, похоже, не работают.
2. Если у вас есть новый вопрос, пожалуйста, поднимите его как новый вопрос, а не как редактирование предыдущего. Когда вы это делаете, для кого-либо становится невозможным связать вопросы и ответы. Кроме того, пожалуйста, не говорите нам, что что — то «не работает», не объяснив нам, как это происходит-насколько нам известно, это дает правильный ответ, но ваши ожидания неверны.
3. Отметил @MichaelKay. Спасибо