2016-12-16 10 views
0

У меня есть требование, где я буду получать XML следующим образом:XSLT, чтобы concate различных значений для повторяющихся элементов

<Input> 
    <Record> 
     <EMPID>FirstEmployee</EMPID> 
    </Record>   
    <Record> 
     <EMPID>SecondEmployee</EMPID> 
    </Record> 
    <Record> 
     <EMPID>FirstEmployee</EMPID> 
    </Record>   
    <Record> 
     <EMPID>SecondEmployee</EMPID> 
    </Record> 
</Input> 

Моего ожидаемый выхода для XML выше, после применения преобразования является:

<Output> 
    <Record> 
     <EMPID>FirstEmployee|1</EMPID> 
    </Record> 
    <Record> 
     <EMPID>SecondEmployee|1</EMPID> 
    </Record> 
    <Record> 
     <EMPID>FirstEmployee|2</EMPID> 
    </Record> 
    <Record> 
     <EMPID>SecondEmployee|2</EMPID> 
    </Record> 
</Output> 

при использовании одно из решений, таким образом,

<?xml version="1.0" encoding="UTF-8" ?> 
<?oracle-xsl-mapper 
    <!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. --> 
    <mapSources> 
    <source type="WSDL"> 
     <schema location="../BPELProcess1.wsdl"/> 
     <rootElement name="Input" namespace="http://xmlns.oracle.com/UMSAdapterVerify/XSLTCheck/BPELProcess1"/> 
    </source> 
    </mapSources> 
    <mapTargets> 
    <target type="WSDL"> 
     <schema location="../BPELProcess1.wsdl"/> 
     <rootElement name="Output" namespace="http://xmlns.oracle.com/UMSAdapterVerify/XSLTCheck/BPELProcess1"/> 
    </target> 
    </mapTargets> 
    <!-- GENERATED BY ORACLE XSL MAPPER 11.1.1.7.8(build 150622.2350.0222) AT [FRI DEC 16 15:55:29 IST 2016]. --> 
?> 
<xsl:stylesheet version="1.0" 
    xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" 
    xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20" 
    xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.service.common.functions.MediatorExtnFunction" 
    xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable" 
    xmlns:client="http://xmlns.oracle.com/UMSAdapterVerify/XSLTCheck/BPELProcess1" 
    xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue" 
    xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath" 
    xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:med="http://schemas.oracle.com/mediator/xpath" 
    xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath" 
    xmlns:bpm="http://xmlns.oracle.com/bpmn20/extensions" 
    xmlns:xdk="http://schemas.oracle.com/bpel/extension/xpath/function/xdk" 
    xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRefXPathFunctions" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:ora="http://schemas.oracle.com/xpath/extension" 
    xmlns:socket="http://www.oracle.com/XSL/Transform/java/oracle.tip.adapter.socket.ProtocolTranslator" 
    xmlns:ldap="http://schemas.oracle.com/xpath/extension/ldap" 
    exclude-result-prefixes="xsi xsl client plnk xsd wsdl bpws xp20 mhdr bpel oraext dvm hwf med ids bpm xdk xref ora socket ldap"> 
    <xsl:template match="/"> 
    <client:Output> 
     <xsl:for-each select="/client:Input/client:Record"> 
     <client:Record> 
      <xsl:variable name="current" select="."/> 
      <xsl:variable name="pos"> 
      <xsl:number level="any" count="client:EMPID[.=$current]"/> 
      </xsl:variable> 
      <client:EMPID> 
      <xsl:value-of select='concat(.,"|",$pos)'/> 
      </client:EMPID> 
     </client:Record> 
     </xsl:for-each> 
    </client:Output> 
    </xsl:template> 
</xsl:stylesheet> 

выход

<Output> 
    <client:Record> 
     <client:EMPID> Srinivas |0</client:EMPID> 
    </client:Record> 
    <client:Record> 
     <client:EMPID> kalyan |0</client:EMPID> 
    </client:Record> 
    <client:Record> 
     <client:EMPID> Srinivas |0</client:EMPID> 
    </client:Record> 
    <client:Record> 
     <client:EMPID> kalyan |0</client:EMPID> 
    </client:Record> 
</Output> 

Может кто-нибудь помочь в этом

+0

В моем коде отсутствует строка 38 (или 42 или 44). –

+0

Я обновил вопрос. Пожалуйста, ознакомьтесь с этим –

ответ

0

Вот вариант, который использует xsl:number ...

XML Input

<Input> 
    <Record> 
     <EMPID>FirstEmployee</EMPID> 
    </Record>   
    <Record> 
     <EMPID>SecondEmployee</EMPID> 
    </Record> 
    <Record> 
     <EMPID>FirstEmployee</EMPID> 
    </Record>   
    <Record> 
     <EMPID>SecondEmployee</EMPID> 
    </Record> 
</Input> 

XSLT 1,0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="/Input"> 
    <Output> 
     <xsl:apply-templates/> 
    </Output> 
    </xsl:template> 

    <xsl:template match="EMPID"> 
    <xsl:variable name="current" select="."/> 
    <xsl:variable name="pos"> 
     <xsl:number level="any" count="EMPID[.=$current]"/> 
    </xsl:variable> 
    <xsl:copy> 
     <xsl:value-of select="concat(.,'|',$pos)"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

XML Output

<Output> 
    <Record> 
     <EMPID>FirstEmployee|1</EMPID> 
    </Record> 
    <Record> 
     <EMPID>SecondEmployee|1</EMPID> 
    </Record> 
    <Record> 
     <EMPID>FirstEmployee|2</EMPID> 
    </Record> 
    <Record> 
     <EMPID>SecondEmployee|2</EMPID> 
    </Record> 
</Output> 

Edit для обновления вопрос ...

Ваш xsl:for-each выбирает client:Record, так что вам нужно обновитьпеременная current, чтобы выбрать ребенка client:EMPID. Вы также должны считать client:Record элементами вместо client:EMPID.

Пример

<xsl:template match="/"> 
    <client:Output> 
    <xsl:for-each select="client:Input/client:Record"> 
     <client:Record> 
     <xsl:variable name="current" select="client:EMPID"/> 
     <xsl:variable name="pos"> 
      <xsl:number level="any" count="client:Record[client:EMPID=$current]"/> 
     </xsl:variable> 
     <client:EMPID> 
      <xsl:value-of select='concat(.,"|",$pos)'/> 
     </client:EMPID> 
     </client:Record> 
    </xsl:for-each> 
    </client:Output> 
</xsl:template> 
+0

. Я обновил вопрос. Я использовал ваш подход, но значение не отражается. –

+0

@srinivaskalyan - Пожалуйста, ознакомьтесь с обновлением в своем ответе. –

0

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

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

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

<xsl:template match="EMPID"> 
    <xsl:variable name="varPresentValue"><xsl:value-of select="."/></xsl:variable> 
    <xsl:copy> 
     <xsl:value-of select="concat(., '|', count(preceding::EMPID[.=$varPresentValue])+1)"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Input"> 
    <Output><xsl:apply-templates/></Output> 
</xsl:template> 

</xsl:stylesheet> 
0

Если все вы хотите различные значения, вы могли бы сделать просто:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="/Input"> 
    <Output> 
     <xsl:apply-templates/> 
    </Output> 
</xsl:template> 

<xsl:template match="EMPID"> 
    <xsl:copy> 
     <xsl:value-of select="."/> 
     <xsl:text>|</xsl:text> 
     <xsl:value-of select="generate-id()"/>  
    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Это гораздо эффективнее, чем многократно подсчитывая предшествующий брат или нумерация аналогичных узлов.

+0

@srinivaskalyan Ваш вопрос помечен 'XSLT', и вышеприведенные работы в XSLT: http://xsltransform.net/bFWR5En. если вы используете несоответствующий процессор или добавляете мой код к себе, меня это не интересует. –

+0

Спасибо @ michael.hor257k ... На самом деле я буду использовать операцию преобразования в Oracle SOA.Шаблон применения копии не работает здесь. Я попытаюсь использовать вашу идею и попытаюсь ее реализовать здесь. –