Jeff Sese wrote:
Hi
I have a source xml that needs to be inserted with new
contents from a separate xml file.
Personnally, I'd do something like this, if I correctly
understood your requirements:
[11] ~/xslt/tests$ cat airplaine.xml
<root>
<entry id="1" type="T" n="1">
<aaa/>
</entry>
<entry id="1" type="T" n="1" n-mod="a">
<bbb/>
</entry>
<entry id="1" type="T" n="2">
<ccc/>
</entry>
<entry id="1" type="T" n="3">
<ddd/>
</entry>
<entry id="1" type="T" n="4">
<eee/>
</entry>
<entry id="1" type="T" n="5">
<fff/>
</entry>
</root>
[12] ~/xslt/tests$ cat airplaine-1.xml
<root>
<entry id="1" type="T" n="1"/>(<xref target="1" type="T"
n="1">1</xref>) <AAA/><entry id="1" type="T" n="1"
n-mod="a"/>(<xref target="1" type="T" n="1a">1a</xref>)
<BBB/><entry
id="1" type="T" n="1-5"/>(<xref target="1" type="T"
n="1-5">1-5</xref>) <CCC/><entry id="1" type="T"
n="2"/>(<xref target="1" type="T" n="2">2</xref>) <DDD/>
</root>
[13] ~/xslt/tests$ cat airplaine.xsl
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:my="my:airplaine.xsl"
exclude-result-prefixes="xs my">
<xsl:param name="new.entry.file" as="xs:anyURI"
select="xs:anyURI('airplaine-1.xml')"/>
<xsl:variable name="new.entry.doc" as="document-node()"
select="document($new.entry.file)"/>
<xsl:variable name="my:id-separator" as="xs:string"
select="'.@@.'"/>
<xsl:function name="my:id" as="xs:string">
<xsl:param name="id" as="xs:string"/>
<xsl:param name="type" as="xs:string"/>
<xsl:param name="n" as="xs:string"/>
<xsl:param name="n-mod" as="xs:string?"/>
<xsl:sequence select="
string-join(
($id, $type, $n, $n-mod),
$my:id-separator
)"/>
</xsl:function>
<xsl:key name="xref" match="xref"
use="my:id(@target, @type, @n, @n-mod)"/>
<xsl:function name="my:xref-from-entry">
<xsl:param name="entry" as="element(entry)"/>
<xsl:variable name="id" as="xs:string" select="
$entry/my:id(@id, @type, @n, @n-mod)"/>
<xsl:sequence select="$new.entry.doc/key('xref', $id)"/>
</xsl:function>
<xsl:template match="entry">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:variable name="xref" select="
my:xref-from-entry(.)"/>
<xsl:if test="$xref">
<new.entry>
<xsl:apply-templates select="
$xref/following-sibling::*[1]"/>
</new.entry>
</xsl:if>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
[14] ~/xslt/tests$ saxon airplaine.xml airplaine.xsl
<?xml version="1.0" encoding="UTF-8"?><root>
<entry id="1" type="T" n="1">
<aaa/>
</entry><new.entry><AAA/></new.entry>
<entry id="1" type="T" n="1" n-mod="a">
<bbb/>
</entry>
<entry id="1" type="T" n="2">
<ccc/>
</entry><new.entry><DDD/></new.entry>
<entry id="1" type="T" n="3">
<ddd/>
</entry>
<entry id="1" type="T" n="4">
<eee/>
</entry>
<entry id="1" type="T" n="5">
<fff/>
</entry>
</root>
[15] ~/xslt/tests$
Regards,
--drkm
___________________________________________________________________________
Découvrez une nouvelle façon d'obtenir des réponses à toutes vos questions !
Profitez des connaissances, des opinions et des expériences des internautes sur
Yahoo! Questions/Réponses
http://fr.answers.yahoo.com
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--