2015-08-21 3 views
0

Я новичок в XSLT My Input XML в залежах:Перемещение Узлы XML, чтобы отделить новый узел с помощью XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <system>Amisys</system> 
    <FindReceiptDetailARRequest> 
     <LegacySystem>Amisys</LegacySystem> 
     <LegacyUserID>ratna</LegacyUserID> 
     <LegacyPassword>ratna</LegacyPassword> 
     <OtherLogin /> 
     <OtherPassword /> 
     <AddSecurLogin /> 
     <AddSecurPassword /> 
     <businessArea>PQAA</businessArea> 
     <GroupNumber>KISHG2D2</GroupNumber> 
     <receiptNumber>OKEY00000698</receiptNumber> 
     <billTo>INDIVIDUAL</billTo> 
     <accountId>CR1277C01</accountId> 
     <GroupId>KISHG2</GroupId> 
     <METHOD>POST</METHOD> 
     <eao>08212015</eao> 
    </FindReceiptDetailARRequest> 
    <results> 
     <ver:receiptDetailHistoryRS xmlns:ver="version4"> 
     <transactionSuccess>true</transactionSuccess> 
     <accountName>NEW CONTRACT TIMEI</accountName> 
     <ver:receiptDetails> 
      <ver:receiptDetail> 
       <appliedAmount>0</appliedAmount> 
       <divisionNumber>127776DIV3</divisionNumber> 
       <invoiceNumber /> 
       <month>2015/02</month> 
       <processedDate>2015-07-28T00:00:00-04:00</processedDate> 
       <receiptNumber>OKEY00000699</receiptNumber> 
       <unappliedAmount>187.00</unappliedAmount> 
      </ver:receiptDetail> 
      <ver:receiptDetail> 
       <appliedAmount>190.00</appliedAmount> 
       <divisionNumber>127776DIV3</divisionNumber> 
       <invoiceNumber /> 
       <month>2015/02</month> 
       <processedDate>2015-07-28T00:00:00-04:00</processedDate> 
       <receiptNumber>OKEY00000698</receiptNumber> 
       <unappliedAmount>0</unappliedAmount> 
      </ver:receiptDetail> 
     </ver:receiptDetails> 
     <receiptDetailHistorySC> 
      <accountId>CR1277C01</accountId> 
      <billTo>INDIVIDUAL</billTo> 
      <divisionNumber /> 
      <invoiceNumber /> 
      <receiptNumber /> 
     </receiptDetailHistorySC> 
     </ver:receiptDetailHistoryRS> 
    </results> 
</response> 

Я хочу, чтобы переместить все узлы под <ver:receiptDetails> отделить новый узел <prvAssocList>.

Мой результат XML должен выглядеть, как

залежи
<?xml version="1.0" encoding="UTF-8"?> 
<FindReceiptDetailScreenResults> 
    <prvAssocList> 
     <prvAssocInfo> 
     <prvAssocCode>OKEY00000699</prvAssocCode> 
     </prvAssocInfo> 
     <prvAssocInfo> 
     <prvAssocCode>OKEY00000698</prvAssocCode> 
     </prvAssocInfo> 
    </prvAssocList> 
</FindReceiptDetailScreenResults> 

Я пытаюсь с парование XSLT, но не работает для меня. Не могли бы вы помочь в этом.

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:variable name="SYS" select="//system" /> 
    <xsl:template match="/"> 
     <FindReceiptDetailScreenResults> 
     <xsl:choose> 
      <xsl:when test="Fault"> 
       <xsl:apply-templates select="Fault" /> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:apply-templates select="//results" /> 
      </xsl:otherwise> 
     </xsl:choose> 
     </FindReceiptDetailScreenResults> 
    </xsl:template> 
    <xsl:template match="Fault"> 
     <xsl:choose> 
     <xsl:when test="faultactor = 'Amisys'"> 
      <PQMessage>not found</PQMessage> 
     </xsl:when> 
     <xsl:otherwise> 
      <PQMessage> 
       <xsl:value-of select="faultstring" /> 
      </PQMessage> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
    <xsl:template match="//results"> 
     <xsl:choose> 
     <xsl:when test="$SYS = 'Amisys'"> 
      <xsl:if test="PQMessage[string(.)]"> 
       <PQMessage> 
        <xsl:value-of select="PQMessage[string(.)]" /> 
       </PQMessage> 
      </xsl:if> 
      <prvAssocList> 
       <xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]"> 
        <prvAssocInfo> 
        <prvAssocCode> 
         <xsl:value-of select="receiptNumber" /> 
        </prvAssocCode> 
        </prvAssocInfo> 
       </xsl:for-each> 
      </prvAssocList> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Вашего описания проблемы не идет хорошо с ожидаемым преобразованием. Можете ли вы попытаться решить проблему. –

+0

Нужна правильная XSLT, чтобы вытащить XML из заданного ввода XML – Pratap

+0

Как написать XSLT, чтобы получить ниже выходной XML из данного входного XML. OKEY00000699 OKEY00000698 Pratap

ответ

2

Когда вы говорите «не работает», вы действительно получаете сообщение об ошибке?

Проблема с этой линии:

<xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]"> 

Вы не объявили префикс пространства имен ver в вашем XSLT, так что я бы ожидать, что XSLT потерпеть неудачу с ошибкой Undeclared namespace prefix {ver}. Просто потому, что префикс пространства имен объявлен как ver в XML, вам все равно нужно объявить его в своем XSLT, если вы хотите получить доступ к узлам в XML.

Итак, первое, что вам нужно сделать, это объявить префикс пространства имен в вашем XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ver="version4"> 

Следующая проблема вы поставили [1] в конце выражения. Это означает, что выражение получит только первый элемент receiptDetail (вернее, он получит первый receiptDetail под каждым узлом receiptDetails, если должно быть несколько узлов receiptDetails).

Попробуйте XSLT (я удалил проверку на fault только упростить вещи)

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ver="version4" exclude-result-prefixes="ver"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:variable name="SYS" select="//system" /> 
    <xsl:template match="/"> 
     <FindReceiptDetailScreenResults> 
     <xsl:apply-templates select="//results" /> 
     </FindReceiptDetailScreenResults> 
    </xsl:template> 

    <xsl:template match="results"> 
     <xsl:choose> 
     <xsl:when test="$SYS = 'Amisys'"> 
      <prvAssocList> 
       <xsl:for-each select="/response/results/ver:receiptDetailHistoryRS/ver:receiptDetails/ver:receiptDetail[1]"> 
        <prvAssocInfo> 
        <prvAssocCode> 
         <xsl:value-of select="receiptNumber" /> 
        </prvAssocCode> 
        </prvAssocInfo> 
       </xsl:for-each> 
      </prvAssocList> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Работая сейчас, большое спасибо. – Pratap

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