добавьте тег XML в сообщение SOAP с помощью XSLT, если тег не существует - PullRequest
0 голосов
/ 14 февраля 2019

Я совершенно новичок в XSLT и не знаю, как найти решение для моего желаемого преобразования.Мы получаем запрос SOAP и должны проверить, существует ли определенный тег (Шаги).Если его нет, я хочу добавить его в сообщение SOAP.

Мы запускаем интерфейс в Azure API Management, который позволяет XSLT только в версии 1.0.

Пример XML

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
   <ProductionToSupply xmlns="http://somenamespace.com">
      <ProductionDataList>
         <ProductionData>
            <Material_Number>5</Material_Number>
            <Doc_Number>1234</Doc_Number>
            <Description>abcde</Description>
         </ProductionData>
      </ProductionDataList>
   </ProductionToSupply>
</soap:Body>
</soap:Envelope>

XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"  
xmlns:ns1="http://somenamespace.com" exclude-result-prefixes="ns1">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="soap:Envelope/soap:Body/ns1:ProductionToSupply/ns1:ProductionDataList/ns1:ProductionData/ns1:Doc_Number">
<xsl:if test="not(soap:Envelope/soap:Body/ns1:ProductionToSupply/ns1:ProductionDataList/ns1:ProductionData/ns1:Steps)">
    <Steps xmlns="http://somenamespace.com">NA</Steps>
</xsl:if>
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>


</xsl:stylesheet>

желаемый результат

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
   <ProductionToSupply xmlns="http://somenamespace.com">
      <ProductionDataList>
         <ProductionData>
            <Material_Number>5</Material_Number>
            <Doc_Number>1234</Doc_Number>
            <Description>abcde</Description>
            <Steps>NA</Steps>
         </ProductionData>
      </ProductionDataList>
   </ProductionToSupply>
</soap:Body>
</soap:Envelope>

Ожидаемый результат будет только добавитьтег «Шаги», если его нет в группе «ProductionData», но я не знаю, как установить соответствующий шаблон соответствия.

Заранее благодарен за помощь, Тим

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы хотите сопоставить группу ProductionData, только если у нее нет элемента Steps, шаблонное совпадение будет таким:

 <xsl:template match="ns1:ProductionData[not(ns1:Steps)]">

Затем вы можете скопировать элемент ProductionDataи его дочерний узел, и вставьте в элемент Steps одновременно

Попробуйте этот XSLT

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"  
xmlns:ns1="http://somenamespace.com" exclude-result-prefixes="ns1">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="ns1:ProductionData[not(ns1:Steps)]">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    <Steps xmlns="http://somenamespace.com">NA</Steps>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

Это добавит Steps в качестве последнего дочернего элемента.Если вы хотели это сразу после Doc_Number, замените шаблон на

<xsl:template match="ns1:ProductionData[not(ns1:Steps)]/ns1:Doc_Number">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
  <Steps xmlns="http://somenamespace.com">NA</Steps>
</xsl:template>
...