2017-01-20 7 views
0

У меня есть исходный XML, какСкопируйте XML узел на основе равноправного узла

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
    <urn:LookupRecords xmlns:urn="urn:RedIron.RetailRepository.Services.SearchService" xmlns:a="urn:RedIron.RetailRepository.Core" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <urn:query> 
     <a:Headers> 
      <a:SearchHeader> 
      <a:Name>MAX_RESULTS</a:Name> 
      <a:ProviderGuid>00000000-0000-0000-0000-000000000000</a:ProviderGuid> 
      <a:Value>10</a:Value> 
      </a:SearchHeader> 
      <a:SearchHeader> 
      <a:Name>CASHIER</a:Name> 
      <a:Value>1706</a:Value> 
      </a:SearchHeader> 
      <a:SearchHeader> 
      <a:Name>RECEIPT_LOOKUP</a:Name> 
      <a:Value>CustomerReceipt</a:Value> 
      </a:SearchHeader> 
     </a:Headers> 
     <a:Params> 
      <arr:KeyValueOfguidArrayOfQueryParametertmL6yAXy> 
      <arr:Key>{4de38819-43bf-4333-a17b-049ec32703c3}</arr:Key> 
      <arr:Value> 
       <a:QueryParameter> 
       <a:Name>TRAINING_MODE</a:Name> 
       <a:Value>FALSE</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>STORE</a:Name> 
       <a:Value>121</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>REGISTER</a:Name> 
       <a:Value>2</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>TRANSACTION_NUMBER</a:Name> 
       <a:Value>1843</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>TRANSACTION_DATE_YEAR</a:Name> 
       <a:Value>2016</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>TRANSACTION_DATE_MONTH</a:Name> 
       <a:Value>12</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>TRANSACTION_DATE_DAY</a:Name> 
       <a:Value>20</a:Value> 
       </a:QueryParameter> 
       <a:QueryParameter> 
       <a:Name>CONCEPT</a:Name> 
       <a:Value>WS</a:Value> 
       </a:QueryParameter> 
      </arr:Value> 
      </arr:KeyValueOfguidArrayOfQueryParametertmL6yAXy> 
     </a:Params> 
     </urn:query> 
    </urn:LookupRecords> 
    </soapenv:Body> 
</soapenv:Envelope> 

Я хочу, чтобы получить результат XML в качестве

<Lookup xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" content="sample string 1" type="sample string 2" pageIndex="sample string 3" pageSize="sample string 4" tranSortOrder="sample string 5"> 
    <RequestData TrainingModeFlag="False" Store="sample string 1" Operator="sample string 2" Terminal="sample string 3"> 
    <TRANSACTION_DATE_YEAR>2016</TRANSACTION_DATE_YEAR> 
    <TRANSACTION_DATE_MONTH>sample string 15</TRANSACTION_DATE_MONTH> 
    <TransactionNumber>sample string 17</TransactionNumber> 
    </RequestData> 
</Lookup> 

Я использую XSLT Для того, чтобы получить то же самое, как

<xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:a="urn:RedIron.RetailRepository.Core" 
     version="2.0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match = "a:QueryParameter" > 
<xsl:apply-templates select="a:QueryParameter[a:Name='TRANSACTION_NUMBER']/a:Value"/> 
</xsl:template> 

<xsl:template match="/"> 
<Lookup tranSortOrder="sample string 5" 
pageSize="sample string 4" 
pageIndex="sample string 3" 
type="sample string 2" 
content="sample string 1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<RequestData Terminal="sample string 3" 
Operator="sample string 2" 
Store="sample string 1" 
TrainingModeFlag="False"> 

<OrderNumber>  
</OrderNumber> 
<TransactionNumber> 
    <xsl:apply-templates /> 
</TransactionNumber> 
</RequestData> 
</Lookup>  
</xsl:template> 
</xsl:stylesheet> 

Использование Xpath в: QueryParameter [а: Имя = ''] TRANSACTION_NUMBER/A: Значение

Я не получаю желаемый комплект (который является 1843)

Пожалуйста, скажите мне, где я ошибаюсь?

+0

Пожалуйста, отредактируйте ваш вопрос и предоставите корректно сформированный XML в качестве примера ввода. –

+0

Привет, Майкл, Обновлен с хорошо сформированным XML – sagar

ответ

0

Первое, что вы должны исправить - это ваш XML.

Обратите внимание, что вы используете там пространства имен для и обр, но не указывать их в основном (Конверте) тег.

Так что я изменил заголовок:

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:a="urn:RedIron.RetailRepository.Core" 
    xmlns:arr="urn:dummy"> 

Я также вставляется <a:QueryParameter> только после того, как <arr:Value> (по-видимому, вы пропустили эту деталь).

Теперь перейдем к вашему XSLT.

Одно изменение заключается в том, что apply-templates (в конце) должен быть ограничен //arr:Value. В противном случае вы также получаете все текстовые узлы из других элементов.

Я сделал также существенные изменения в шаблоне, соответствующем QueryParameter.

Обратите внимание на содержание каждого select пункта:

a:QueryParameter[a:Name/text()='...']/a:Value 

Это на самом деле означает:

  • тейк ребенка QueryParameter узел - a:QueryParameter,
  • такие, что - [...],
  • он имеет a:Name дочерний узел,
  • , который имеет текстовый дочерний узел - /text(),
  • равна строке ='...',
  • и от этого (QueryParameter) узла принимают содержание ребенка a:Value.

Ваша ошибка состоит в том, что, когда вы хотите сравнить содержимое узла до некоторого значения в предиката, вы должны использовать text() ссылаться на текстовое содержимое этого узла.

Не требуется, например. в value-of.

Ниже вы изменили свой XSLT.

Обратите внимание, что поскольку я ссылался на пространство имен arr, мне пришлось добавить его в тег stylesheet.

<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:a="urn:RedIron.RetailRepository.Core" 
    xmlns:arr="urn:dummy" 
    version="2.0"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="arr:Value" > 
    <TRANSACTION_DATE_YEAR> 
    <xsl:value-of 
     select="a:QueryParameter[a:Name/text()='TRANSACTION_DATE_YEAR']/a:Value"/> 
    </TRANSACTION_DATE_YEAR> 
    <TRANSACTION_DATE_MONTH> 
    <xsl:value-of 
     select="a:QueryParameter[a:Name/text()='TRANSACTION_DATE_MONTH']/a:Value"/> 
    </TRANSACTION_DATE_MONTH> 
    <TransactionNumber> 
    <xsl:value-of 
     select="a:QueryParameter[a:Name/text()='TRANSACTION_NUMBER']/a:Value"/> 
    </TransactionNumber> 
</xsl:template> 

<xsl:template match="/"> 
<Lookup tranSortOrder="sample string 5" pageSize="sample string 4" 
pageIndex="sample string 3" type="sample string 2" content="sample string 1" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <RequestData Terminal="sample string 3" Operator="sample string 2" 
    Store="sample string 1" TrainingModeFlag="False"> 
    <xsl:apply-templates select="//arr:Value"/> 
    </RequestData> 
</Lookup>  
</xsl:template> 
</xsl:stylesheet> 
+0

Привет Валди, Спасибо за ответ, я преодолел ошибки, но все же не смог получить результат, как ожидалось. Как 'a: QueryParameter [a: Name/text() =' TRANSACTION_DATE_YEAR ']/a: Значение' не дает значения, которое я хотел. Вместо этого он дает пустой узел. – sagar

+0

А как насчет других узлов (месяц и номер транзакции)? Правильно ли они преобразуются? Проверьте исходный XML-код на наличие возможных орфографических ошибок. Еще одна вещь, которую нужно проверить: использовать любой онлайн-транслятор XSLT (например, http://xsltransform.net/). Введите туда (исправленный) XML и мой XSLT. Прежде чем я представила этот ответ, я проделал это так. –

+0

Извини, это была моя ошибка. Мне пришлось изменить пространство имен. Большое спасибо за помощь... – sagar

Смежные вопросы