Nano Hash - криптовалюты, майнинг, программирование

Скопируйте содержимое, сопоставив тег XML

Я хочу скопировать все содержимое XML, сопоставив определенный узел, и добавить конверт SOAP для каждого повторяющегося узла postItemCost.

Исходный XML:

    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>0.00</avgcost>
            <lastcost>0.00</lastcost>
            <stdcost>0.00</stdcost>
          </invcost>
          <location>2201</location>
        </ItemInvCostRequest>
        <itemnum>9322979</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>

    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>0.00</avgcost>
            <lastcost>0.00</lastcost>
            <stdcost>0.00</stdcost>
          </invcost>
          <location>1101</location>
        </ItemInvCostRequest>
        <itemnum>9322979</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>

    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>1000.00</avgcost>
            <lastcost>1000.00</lastcost>
            <stdcost>1000.00</stdcost>
          </invcost>
          <location>1101</location>
        </ItemInvCostRequest>
        <itemnum>9322984</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>
  </ns0:Message1>
</ns0:Messages>

Ожидаемый результат -

<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
  <ns0:Message1>

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>0.00</avgcost>
            <lastcost>0.00</lastcost>
            <stdcost>0.00</stdcost>
          </invcost>
          <location>2201</location>
        </ItemInvCostRequest>
        <itemnum>9322979</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>
    </soapenv:Body>
    </soapenv:Envelope>

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>0.00</avgcost>
            <lastcost>0.00</lastcost>
            <stdcost>0.00</stdcost>
          </invcost>
          <location>1101</location>
        </ItemInvCostRequest>
        <itemnum>9322979</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>
    </soapenv:Body>
    </soapenv:Envelope>

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
    <ns1:postItemCost xmlns:ns1="http://items.test.com/">
      <ItemInvCostReqList>
        <ItemInvCostRequest>
          <invcost>
            <avgcost>1000.00</avgcost>
            <lastcost>1000.00</lastcost>
            <stdcost>1000.00</stdcost>
          </invcost>
          <location>1101</location>
        </ItemInvCostRequest>
        <itemnum>9322984</itemnum>
      </ItemInvCostReqList>
    </ns1:postItemCost>
    </soapenv:Body>
    </soapenv:Envelope>

Это мой XSLT:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="w3.org/1999/XSL/Transform" xmlns:ns0="sap.com/xi/XI/SplitAndMerge" version="1.0">
  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" omit-xml-declaration="yes"/>
  <xsl:template match="/">
    <soapenv:Envelope xmlns:soapenv="schemas.xmlsoap.org/soap/envelope">
      <soapenv:Header/>
      <soapenv:Body>
        <xsl:template match="Message//Message1//postInvCostRequest">
          <xsl:copy-of select="/postInvCostRequest"/>
        </xsl:template>
      </soapenv:Body>
    </soapenv:Envelope>
  </xsl:template>
</xsl:stylesheet>

Я хочу добавить конверт SOAP для каждого повторяющегося узла 'postItemCost'.
Итак, не могли бы вы помочь мне с кодом XSLT, который поможет мне добиться ожидаемого результата.

28.01.2019

  • У вас не может быть шаблона в другом шаблоне. 29.01.2019

Ответы:


1

Попробуй так?

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"
xmlns:ns1="http://items.test.com/">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ns0:Messages">
    <xsl:copy>
        <ns0:Message1>
            <xsl:for-each select="ns0:Message1/ns1:postItemCost">
                <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                    <soapenv:Header/>
                    <soapenv:Body>
                        <xsl:copy-of select="."/>
                    </soapenv:Body>
                </soapenv:Envelope>
            </xsl:for-each>
        </ns0:Message1>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Демонстрация: http://xsltransform.net/jxWYjVU


Добавлен:

Как указано в комментариях, вы не можете контролировать, где будет отображаться объявление пространства имен. Следующий трюк будет работать с некоторыми процессорами и заставит объявление xmlns:ns1="http://items.test.com/" появляться в элементах ns1:postItemCost, но нельзя гарантировать, что он будет работать с каждым процессором или сериализующим компонентом вашей цепочки обработки:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"
xmlns:ns3="http://items.test.com/"
exclude-result-prefixes="ns3">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ns0:Messages">
    <xsl:copy>
        <ns0:Message1>
            <xsl:for-each select="ns0:Message1/ns3:postItemCost">
                <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                    <soapenv:Header/>
                    <soapenv:Body>
                        <xsl:copy-of select="."/>
                    </soapenv:Body>
                </soapenv:Envelope>
            </xsl:for-each>
        </ns0:Message1>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
29.01.2019
  • Что мне изменить, если мне нужно отправить пространство имен «ns1» как часть тега «postItemCost», как показано ниже. ‹ns1:postItemCost xmlns:ns1=items.test.com 29.01.2019
  • Ничего. Пространство имен уже объявлено в элементе-предке и наследуется оттуда. 29.01.2019
  • Спасибо за помощь, Майкл, однако мои сообщения разделяются для каждого узла «postItemcost», поэтому мне нужно пространство имен с каждым узлом, а не с предком. следовательно, он терпит неудачу в целевой системе. 29.01.2019
  • Тогда проблема связана с вашим методом разделения, а не с результатом преобразования XSL. Как правило, вы не можете контролировать, где будет отображаться объявление пространства имен — это решает ваш XSLT-процессор (или сериализующий компонент вашей цепочки обработки). Вы можете попробовать обмануть его, как показано здесь: xsltransform.net/jxWYjVU/1, но это не гарантирует работу. с каждым процессором. 29.01.2019
  • Спасибо, Майкл! Я так догадался. Но указанная вами ссылка не работает. 29.01.2019
  • Смотрите дополнение к моему посту. 29.01.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..