Это мой оригинальный XML-файл:
<?xml version="1.0" encoding="windows-1250"?>
<CONTACTS>
<CONTACT>
<FirstName>Arun</FirstName>
<LastName>Arun_niit</LastName>
<EMail>nuraaa_iceee@yahoo.co.in</EMail>
</CONTACT>
<CONTACT>
<FirstName>Arun</FirstName>
<LastName>Arun_niit</LastName>
<EMail>nuraaa_iceee@gmail.com</EMail>
</CONTACT>
<CONTACT>
<FirstName>KumarVeera</FirstName>
<LastName>Veera Kumar</LastName>
<EMail>KUMARg_8111@yahoo.com</EMail>
</CONTACT>
<CONTACT>
<FirstName>MarbellaFunkybuddha</FirstName>
<LastName>Funkybuddha Marbella</LastName>
<URL>http://www.facebook.com/profile.php?id=111123301493096451</URL>
</CONTACT>
<CONTACT>
<FirstName>Rangarajkarthik</FirstName>
<LastName>karthik Rangaraj</LastName>
<EMail>kart200006@gmail.com</EMail>
<EMail>karthikrangaraju@yahoo.com</EMail>
</CONTACT>
<CONTACT>
<FirstName>Rangaraj</FirstName>
<LastName>karthik </LastName>
<EMail>kart200006@gmail.com</EMail>
<EMail>karthikrangaraju@yahoo.com</EMail>
</CONTACT>
</CONTACTS>
У меня есть 4 XSl-файла, которые отлично работают, если я выполняю один за другим, используя XSLT-процессор в Firefox XUL.Когда я выполняю все файлы XSL один за другим одновременно, это не генерирует окончательный результат.
Это фактический вывод вышеуказанного XML-файла, если я использую XSL-файлы один за другим:
<?xml version="1.0" encoding="UTF-8"?>
<CONTACTS>
<CONTACT>
<CUS-ID>PDE-ID2</CUS-ID>
<FirstName>Arun</FirstName>
<LastName>Arun_niit</LastName>
<gmail>nuraaa_iceee@gmail.com</gmail>
<yahoo>nuraaa_iceee@yahoo.co.in</yahoo>
<URL/>
<Facebook-ID/>
</CONTACT>
<CONTACT>
<CUS-ID>PDE-ID4</CUS-ID>
<FirstName>KumarVeera</FirstName>
<LastName>Veera Kumar</LastName>
<gmail/>
<yahoo>KUMARg_8111@yahoo.com</yahoo>
<URL/>
<Facebook-ID/>
</CONTACT>
<CONTACT>
<CUS-ID>PDE-ID6</CUS-ID>
<FirstName>MarbellaFunkybuddha</FirstName>
<LastName>Funkybuddha Marbella</LastName>
<gmail/>
<yahoo/>
<URL>http://www.facebook.com/profile.php?id=111123301493096451</URL>
<Facebook-ID>1123301493096451</Facebook-ID>
</CONTACT>
<CONTACT>
<CUS-ID>PDE-ID12</CUS-ID>
<FirstName>Rangarajkarthik</FirstName>
<LastName>karthik Rangaraj</LastName>
<gmail>kart200006@gmail.com</gmail>
<yahoo>karthikrangaraju@yahoo.com</yahoo>
<URL/>
<Facebook-ID/>
</CONTACT>
</CONTACTS>
Это фактическая функция JS для вызова XSl-файла в XUL:
function process()
{
var src = readFile("D:\\createXML2.xsl");
var parsed = (new DOMParser()).parseFromString(src, "text/xml");
var stylesheet = parsed.documentElement;
var processor = new XSLTProcessor();
processor.importStylesheet(stylesheet );
objXMLDoc = processor.transformToDocument(objXMLDoc);
var serializer = new XMLSerializer();
var prettyString = serializer.serializeToString(objXMLDoc);
saveFile(prettyString, "D:\\aout30.xml");
//alert('New Contact updated successfully');
var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
.getService(Components.interfaces.nsIPromptService);
prompts.alert(null, "Final creation", "Final creation is done");
process2();
}
Это XSL-файлы, которые я использую для генерации окончательного результата:
File1: объединить контакты с одинаковыми номерами FN и LN
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="groupName" match="//CONTACTS/CONTACT" use="concat(FirstName, LastName)" />
<xsl:template match="CONTACTS">
<CONTACTS>
<xsl:for-each select="//CONTACTS/CONTACT[generate-id() = generate-id( key('groupName', concat(FirstName, LastName)) [1] ) ]" >
<xsl:sort select="CONTACT/EMail" />
<xsl:call-template name="group">
<xsl:with-param name="k1" select="FirstName" />
<xsl:with-param name="k2" select="LastName" />
</xsl:call-template>
</xsl:for-each>
</CONTACTS>
</xsl:template>
<xsl:template name="group">
<xsl:param name="k1" />
<xsl:param name="k2" />
<CONTACT>
<xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][1]">
<xsl:copy-of select="FirstName" />
<xsl:copy-of select="LastName" />
<!-- here we have the first Email -->
<xsl:copy-of select="EMail" />
</xsl:for-each>
<xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() > 1]">
<!-- here we have the next Email -->
<xsl:copy-of select="EMail" />
</xsl:for-each>
<xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() > 2]">
<!-- here we have the next Email -->
<xsl:copy-of select="EMail" />
</xsl:for-each>
<xsl:for-each select="//CONTACTS/CONTACT[FirstName = $k1][LastName = $k2][position() > 3]">
<!-- here we have the next Email -->
<xsl:copy-of select="EMail" />
</xsl:for-each>
<xsl:copy-of select="URL" />
</CONTACT>
</xsl:template>
</xsl:stylesheet>
File2:Объединить один и тот же адрес электронной почты разных контактов
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:key name="k_ContactsByEmail"
match="CONTACTS/CONTACT"
use="EMail"/>
<xsl:template match="CONTACTS">
<xsl:copy>
<xsl:apply-templates select="CONTACT[generate-id()=
generate-id(key('k_ContactsByEmail',EMail)[1])]
|
CONTACT[not(EMail)]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="CONTACT">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:copy-of select="
key('k_ContactsByEmail', EMail)/*
[not(.=current()/*)]
[not(self::FirstName or self::LastName)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Файл 3: Файл 3 для разделения значений электронной почты в соответствии с типом домена
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="CONTACT">
<xsl:copy>
<xsl:copy-of select="FirstName|LastName|URL"/>
<Facebook-ID><!-- To extract the ID value from URL/Email -->
<xsl:choose>
<xsl:when test="URL">
<xsl:value-of select="substring-after(URL,'?id=')"/>
</xsl:when>
<xsl:otherwise>
<!-- <xsl:value-of select="substring-before(EMail[1],'@')"/>-->
</xsl:otherwise>
</xsl:choose>
</Facebook-ID>
<EMAILS>
<xsl:apply-templates select="EMail"/>
</EMAILS>
</xsl:copy>
</xsl:template>
<xsl:template match="EMail">
<EMail> <!-- To extract the Emails based on domain value from EMAIL -->
<Type><xsl:value-of select="substring-before(
substring-after(.,'@'),
'.')"/>
</Type>
<Value><xsl:value-of select="."/></Value>
</EMail>
</xsl:template>
</xsl:stylesheet>
Файл 4: Создать идентификатор Cutomer для каждого контакта идобавьте тег домена электронной почты к типу значений электронной почты из 3-го сгенерированного xsl-файла вывода.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<!--Identity template to copy content forward-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="CONTACT">
<xsl:copy>
<CUS-ID>
<xsl:apply-templates select="." mode="generate-id"/>
</CUS-ID>
<FirstName>
<xsl:value-of select="FirstName"/>
</FirstName>
<LastName>
<xsl:value-of select="LastName"/>
</LastName>
<gmail>
<xsl:value-of select="EMAILS/EMail[Type='gmail']/Value"/>
</gmail>
<yahoo>
<xsl:value-of select="EMAILS/EMail[Type='yahoo']/Value"/>
</yahoo>
<URL>
<xsl:value-of select="URL"/>
</URL>
<Facebook-ID>
<xsl:value-of select="Facebook-ID"/>
</Facebook-ID>
</xsl:copy>
</xsl:template>
<xsl:template match="node()" mode="generate-id">
<xsl:text>PDE-ID</xsl:text>
<xsl:number level="any" count="node()" format="10000"/>
</xsl:template>
</xsl:stylesheet>
Иногда он генерирует правильный вывод, но большую часть времени он не работает.Я действительно не понимаю, в чем может быть проблема.Есть ли возможность объединить все эти файлы SL в один файл?Пожалуйста, помогите мне.Спасибо.