2010-07-08 9 views
1

Ниже файл примерпространство имен в XSLT

<?xml version='1.0' encoding='UTF-8'?> 
<Document xmlns='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 
<pain.002.001.02> 
------------ 
------------- 
------------- 

</pain.002.001.02> 
</Document> 

Ниже приведен код трансформации XSLT:

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sap="http://www.sap.com/sapxsl" 
    xmlns:asx="http://www.sap.com/abapxml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 


<asx:abap version="1.0"> 
<asx:values> 

<xsl:for-each select="Document/pain.002.001.02"> 
<ACK_HEADER> 
<ZTFI_PYSTATUS_HD> 
    <xsl:for-each select="GrpHdr[1]"> 
    <ORGNLMSG_ID><xsl:value-of select="MsgId"/></ORGNLMSG_ID> 
<!-- <MSG_CRTD_DATE><xsl:value-of select="CreDtTm"/></MSG_CRTD_DATE>--> 
<xsl:variable name="date_time" select="CreDtTm"/> 
<MSG_CRTD_DATE><xsl:value-of select="substring-before(@T,',$date_time')"/></MSG_CRTD_DATE> 
<!--Payment Acknowledgement Header data--> 
</xsl:for-each> 

<xsl:for-each select="OrgnlGrpInfAndSts[1]"> 
<MSGID><xsl:value-of select="OrgnlMsgId"/></MSGID> 
<xsl:variable name="msgid" select="OrgnlMsgId"/> 
<ORIGNLMSG_NM_ID><xsl:value-of select="OrgnlMsgNmId"/></ORIGNLMSG_NM_ID> 
<ORGNL_NO_OF_TRAN><xsl:value-of select="OrgnlNbOfTxs"/></ORGNL_NO_OF_TRAN> 
<ORGNL_CNTRL_SUM><xsl:value-of select="OrgnlCtrlSum"/></ORGNL_CNTRL_SUM> 
<ORGNL_FILE_STAT><xsl:value-of select="GrpSts"/></ORGNL_FILE_STAT> 
<xsl:for-each select="NbOfTxsPerSts"> 
<xsl:choose> 
<xsl:when test="DtldSts='ACSP'"> 
<ORGNL_NO_OF_ACSP><xsl:value-of select="DtldNbOfTxs"/></ORGNL_NO_OF_ACSP> 
<ORGNL_ACSP_SUM><xsl:value-of select="DtldCtrlSum"/></ORGNL_ACSP_SUM> 
</xsl:when> 
<xsl:when test="DtldSts='RJCT'"> 
<ORGNL_NO_OF_RJCT><xsl:value-of select="DtldNbOfTxs"/></ORGNL_NO_OF_RJCT> 
<ORGNL_RJCT_SUM><xsl:value-of select="DtldCtrlSum"/></ORGNL_RJCT_SUM> 
</xsl:when> 
</xsl:choose> 
</xsl:for-each> 
</xsl:for-each> 
</ZTFI_PYSTATUS_HD> 
</ACK_HEADER> 
<ACK_DETAIL> 

<!--Payment Acknowledgement Detail data--> 

<xsl:for-each select="TxInfAndSts"> 
<ZTFI_PYSTATUS_DT> 
<MSGID><xsl:value-of select="$msgid"/></MSGID> 
<PMT_INFO_IDENT><xsl:value-of select="OrgnlPmtInfId"/></PMT_INFO_IDENT> 
<END_2_END_ID><xsl:value-of select="OrgnlEndToEndId"/></END_2_END_ID> 
<TRAN_STATUS><xsl:value-of select="TxSts"/></TRAN_STATUS> 
<INSTRU_IDENT><xsl:value-of select="OrgnlInstrId"/></INSTRU_IDENT> 
<xsl:for-each select="StsRsnInf[1]"> 
<STAT_RE_AD_INFO><xsl:value-of select="AddtlStsRsnInf"/></STAT_RE_AD_INFO> 
</xsl:for-each> 
<xsl:for-each select="OrgnlTxRef[1]"> 
<xsl:for-each select="Amt[1]"> 
<xsl:for-each select="InstdAmt[1]"> 
<INSTRCTD_AMT><xsl:value-of select="string()"/></INSTRCTD_AMT> 
<CURRENCY><xsl:value-of select="@Ccy"/></CURRENCY> 
</xsl:for-each> 
</xsl:for-each> 
<REQ_EXEC_DATE><xsl:value-of select="ReqdExctnDt"/></REQ_EXEC_DATE> 
<xsl:for-each select="CdtrAcct[1]"> 
<xsl:for-each select="Id[1]"> 
<xsl:for-each select="PrtryAcct[1]"> 
<LIFNR><xsl:value-of select="Id"/></LIFNR> 
</xsl:for-each> 
</xsl:for-each> 
</xsl:for-each> 


</xsl:for-each> 
</ZTFI_PYSTATUS_DT> 
</xsl:for-each> 
</ACK_DETAIL> 
</xsl:for-each> 
</asx:values> 
</asx:abap> 
</xsl:template> 
</xsl:transform> 

когда я исключить следующую строку (в теге документа) из файла XML я я могу трансформироваться.

'xmlns='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> 

, но когда я включаю в себя одну и ту же строку преобразования XSLT. это не работает.

Пожалуйста, сделайте необходимое.

С уважением, Kiran.

+0

@kiram puram: Зачем использовать все эти инструкции 'for-each'? Это не способ лечить язык! Возможно, вы напишете программу в «С» в одной процедуре? Пожалуйста, напишите полный образец заявки, и, возможно, кто-то может помочь вам с кодом. Это поможет в будущем обслуживании кода. – 2010-07-08 22:57:02

ответ

1

Добавить XML-пространства документа в вашей XSL декларации

<xsl:transform version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:sap="http://www.sap.com/sapxsl" 
    xmlns:asx="http://www.sap.com/abapxml" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:doc='urn:iso:std:iso:20022:tech:xsd:pain.002.001.02' 
> 

и обратиться к своим узлам префиксом doc:. Например:

<xsl:for-each select="doc:pain.002.001.02"> 

EDIT Для вашей проблемы попробуйте:

<xsl:for-each select="doc:Document/doc:pain.002.001.02"> 
+0

Здравствуйте, Gregoire, Благодарим за быстрый ответ. я изменил код, но все же он не работает. Ниже приведен код изменения: Пожалуйста, помогите мне. Спасибо и с уважением, Kiran. –

+0

@kiran puram: см. Мое редактирование – Gregoire

0

Это FAQ. XPath обрабатывает неподписанные имена элементов как принадлежащие к «без пространства имен».

Всякий раз, когда XML-документ имеет пространство имен по умолчанию, единственный способ ссылаться на элементы по имени - ссылаться на них как префикс, где префикс привязан к пространству имен по умолчанию.

Это означает:

  1. Associate префикс (скажем, "ххх") в пространстве имен по умолчанию документа.

  2. В любом выражении XPath или шаблоне соответствия заменить каждое имя элемента на соответствующее имя с префиксом. Например, заменить /a/b/c/d с /xxx:a/xxx:b/xxx:c/xxx:d

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

+0

Здравствуйте, Димитр Новачев/Gregoire, сейчас разрешен. Спасибо за тонкую помощь. Спасибо, С уважением, Kiran. –

+0

kiran-puram: Рад, что он разрешен. В StackOverflow (SO). человек, который задал вопрос, обычно * принимает * один из ответов (нажав галочку рядом с ответом). Я думаю, вы не знали об этом ... :) –

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