Mercurial > hg > mpdl-group
view software/mpdl-services/mpiwg-mpdl-xml/bin/de/mpg/mpiwg/berlin/mpdl/xml/transform/getFragmentSaxonFast.xsl @ 23:e845310098ba
diverse Korrekturen
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Tue, 27 Nov 2012 12:35:19 +0100 |
parents | |
children |
line wrap: on
line source
<?xml version="1.0"?> <!-- Delivers the fragment between two milestones. Takes no care about namespaces. --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="local-function"> <xsl:function name="fn:contains"> <xsl:param name="sequence" as="node()*"/> <xsl:param name="node" as="node()?"/> <xsl:sequence select="some $nodeInSequence in $sequence satisfies $nodeInSequence is $node"/> </xsl:function> <xsl:output method="xml" encoding="utf-8"/> <!-- ms1Name and ms2Name have to be given without namespace: e.g. "pb" --> <xsl:param name="xmlFileName"></xsl:param> <xsl:param name="ms1Name"></xsl:param> <xsl:param name="ms1Position"></xsl:param> <xsl:param name="ms2Name"></xsl:param> <xsl:param name="ms2Position"></xsl:param> <!-- the doc method is ca. 25% faster than over the source document --> <xsl:variable name="xmlDocExpr" select="saxon:expression('doc($p1)')" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name ="xmlDoc" select="saxon:eval($xmlDocExpr, $xmlFileName)" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name="ms1AllExpr" select="saxon:expression('$p1//*[name() = $p2]')" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name ="ms1All" select="saxon:eval($ms1AllExpr, $xmlDoc, $ms1Name)" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name="ms1" select="subsequence($ms1All, $ms1Position, 1)"/> <xsl:variable name="ms2AllExpr" select="saxon:expression('$p1//*[name() = $p2]')" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name ="ms2All" select="saxon:eval($ms2AllExpr, $xmlDoc, $ms2Name)" xmlns:saxon="http://saxon.sf.net/"/> <xsl:variable name="ms2" select="subsequence($ms2All, $ms2Position, 1)"/> <xsl:variable name="ms1Ancestors" select="$ms1/ancestor::*"/> <xsl:variable name="ms2Ancestors" select="$ms2/ancestor::*"/> <xsl:template match="/"> <xsl:apply-templates select="$xmlDoc" mode="doc"/> </xsl:template> <xsl:template match="element()[local-name() != $ms1Name and local-name() != $ms2Name]" mode="doc"> <xsl:choose> <xsl:when test="(. >> $ms1 or fn:contains($ms1Ancestors, .)) and ($ms2 >> . or fn:contains($ms2Ancestors, .))"> <xsl:element name="{local-name(.)}"><xsl:apply-templates mode="doc"/></xsl:element> </xsl:when> <xsl:otherwise><xsl:apply-templates mode="doc"/></xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="attribute()|text()|comment()|processing-instruction()" mode="doc"> <xsl:choose> <xsl:when test=". >> $ms1 and $ms2 >> ."> <xsl:copy><xsl:apply-templates mode="doc"/></xsl:copy> </xsl:when> <xsl:otherwise><xsl:apply-templates mode="doc"/></xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="element()[local-name() = $ms1Name or local-name() = $ms2Name]" mode="doc"> <xsl:choose> <xsl:when test=". is $ms1"> <xsl:element name="{local-name(.)}"><xsl:copy-of select="@*"></xsl:copy-of></xsl:element> </xsl:when> <xsl:when test=". is $ms2"> <xsl:element name="{local-name(.)}"><xsl:copy-of select="@*"></xsl:copy-of></xsl:element> <!-- <xsl:message terminate="yes">Terminate</xsl:message> --> </xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>