Mercurial > hg > mpdl-group
view software/eXist/webapp/mpdl/presentation/insertExternalElements.xsl @ 15:e99964f390e4
diverse Fehlerbehebungen
author | Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de> |
---|---|
date | Mon, 29 Aug 2011 17:40:19 +0200 |
parents | 469d927b9ca7 |
children | 7e883ce72fec |
line wrap: on
line source
<?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:saxon="http://saxon.sf.net/" xmlns:text="http://www.mpiwg-berlin.mpg.de/ns/mpdl/text" xmlns:mpdlxmlutil="java:de.mpg.mpiwg.berlin.mpdl.util.XmlUtil" > <xsl:output method="xml" encoding="utf-8"/> <xsl:output name="myXml" indent="yes" omit-xml-declaration="yes"/> <xsl:variable name="externalElements" select="/result/externalElements"/> <xsl:variable name="xpointer" select="/result/xpointer"/> <xsl:variable name="xpointerPath"> <xsl:choose> <xsl:when test="contains($xpointer, '/range(')"> <xsl:value-of select="substring-before($xpointer, '/range(')"/> </xsl:when> <xsl:when test="contains($xpointer, '/point(')"> <xsl:value-of select="substring-before($xpointer, '/point(')"/> </xsl:when> <xsl:otherwise><xsl:value-of select="$xpointer"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="xpointerRange"> <xsl:choose> <xsl:when test="contains($xpointer, '/range(')"> <xsl:value-of select="substring-before(substring-after($xpointer, '/range('), ')')"/> </xsl:when> <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="xpointerPoint"> <xsl:choose> <xsl:when test="contains($xpointer, '/point(')"> <xsl:value-of select="substring-before(substring-after($xpointer, '/point('), ')')"/> </xsl:when> <xsl:otherwise><xsl:value-of select="''"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="xpointerRangeFromTmp" select="substring-before($xpointerRange, ',')"/> <xsl:variable name="xpointerRangeFrom"> <xsl:choose> <xsl:when test="$xpointerRangeFromTmp = ''"> <xsl:value-of select="xs:integer(0)"/> </xsl:when> <xsl:when test="contains($xpointerRangeFromTmp, '-')"> <xsl:value-of select="xs:integer(0)"/> </xsl:when> <xsl:otherwise><xsl:value-of select="xs:integer($xpointerRangeFromTmp)"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="xpointerRangeToTmp" select="substring-after($xpointerRange, ',')"/> <xsl:variable name="xpointerRangeTo"> <xsl:choose> <xsl:when test="$xpointerRangeToTmp = ''"> <xsl:value-of select="xs:integer(0)"/> </xsl:when> <xsl:when test="contains($xpointerRangeToTmp, '-')"> <xsl:value-of select="xs:integer(0)"/> </xsl:when> <xsl:otherwise><xsl:value-of select="xs:integer($xpointerRangeToTmp)"/></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="fragment" select="/result/fragment"/> <xsl:template match="result"> <xsl:apply-templates/> </xsl:template> <xsl:template match="fragment"> <xsl:apply-templates/> </xsl:template> <xsl:template match="externalElements"></xsl:template> <xsl:template match="xpointer"></xsl:template> <xsl:template match="attribute()|text()|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates select="attribute()|element()|text()|comment()|processing-instruction()"/> </xsl:copy> </xsl:template> <xsl:template match="element()"> <xsl:variable name="elemXmlNodeIdTmp" select="saxon:path(.)"/> <xsl:variable name="elemXmlNodeId" select="concat('/', substring-after(substring-after(substring-after($elemXmlNodeIdTmp, '/'), '/'), '/'))"/> <xsl:variable name="extElemXmlNodeIds" select="$externalElements//@xmlNodeId"/> <!-- Bug: if there are more than one external node at the same position, index-of delivers an error: ToDo: handle more than one external nodes at one position --> <xsl:variable name="extElemIndex" select="index-of($extElemXmlNodeIds, $elemXmlNodeId)"/> <xsl:variable name="extElem" select="$externalElements/*[$extElemIndex]"/> <xsl:variable name="extElemContent" select="$extElem/*[1]"/> <xsl:variable name="extElemXPointer" select="$extElem/@xpointer"/> <xsl:variable name="extElemXPointerPoint" select="substring-before(substring-after($extElemXPointer, '/point('), ')')"/> <xsl:variable name="extElemXPointerPointInt"> <xsl:choose> <xsl:when test="$extElemXPointerPoint != '.0' and $extElemXPointerPoint != '.1' and $extElemXPointerPoint != ''"> <xsl:value-of select="xs:integer($extElemXPointerPoint)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="xs:integer(-1)"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="insertedXPointer"> <xsl:choose> <xsl:when test="$xpointerRange != ''"> <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/> <xsl:variable name="tmp" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $elemSerialized, string($xpointerRangeFrom), '<seg rend="highlight">')"/> <xsl:variable name="tmp2" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $tmp, string($xpointerRangeTo), '</seg>')"/> <xsl:sequence select="saxon:parse($tmp2)"/> </xsl:when> <xsl:when test="$xpointerPoint = '.0'"> <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/> <xsl:variable name="tmp" select="'<bla>'"/><xsl:value-of select="'<seg rend="highlightPoint"/>'"/><xsl:value-of select="$elemSerialized"/><xsl:value-of select="'</bla>'"/> <xsl:sequence select="saxon:parse($tmp)"/> </xsl:when> <xsl:when test="$xpointerPoint = '.1'"> <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/> <xsl:variable name="tmp" select="'<bla>'"/><xsl:value-of select="$elemSerialized"/><xsl:value-of select="'<seg rend="highlightPoint"/>'"/><xsl:value-of select="'</bla>'"/> <xsl:sequence select="saxon:parse($tmp)"/> </xsl:when> <xsl:when test="$xpointerPoint != ''"> <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/> <xsl:variable name="tmp" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $elemSerialized, string($xpointerPoint), '<seg rend="highlightPoint"/>')"/> <xsl:sequence select="saxon:parse($tmp)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="''"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="thisElement"> <xsl:copy> <xsl:apply-templates select="attribute()"/> <xsl:attribute name="xmlNodeId"> <xsl:value-of select="$elemXmlNodeId"/> </xsl:attribute> <xsl:apply-templates select="element()|text()|comment()|processing-instruction()"/> </xsl:copy> </xsl:variable> <xsl:if test="$extElemXPointerPoint = '.0'"> <xsl:sequence select="$extElemContent"/> </xsl:if> <xsl:if test="$extElemXPointerPointInt >= 0"> <xsl:variable name="extElemContent" select="$extElem/*[1]"/> <xsl:variable name="extElemContentSerialized" select="saxon:serialize($extElemContent, 'myXml')"/> <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/> <xsl:variable name="insertedElemSerialized" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $elemSerialized, string($extElemXPointerPointInt), $extElemContentSerialized)"/> <xsl:variable name="insertedElemDeSerializedTmp" select="saxon:parse($insertedElemSerialized)"/> <xsl:variable name="insertedElemDeSerialized"> <xsl:element name="{name()}"> <xsl:apply-templates select="attribute()"/> <xsl:attribute name="xmlNodeId"> <xsl:value-of select="$elemXmlNodeId"/> </xsl:attribute> <xsl:sequence select="$insertedElemDeSerializedTmp/*[1]/node()"/> </xsl:element> </xsl:variable> <xsl:sequence select="$insertedElemDeSerialized"/> </xsl:if> <xsl:if test="$extElemXPointerPoint = '.0' or $extElemXPointerPoint = '.1' or $extElemXPointerPoint = ''"> <xsl:choose> <xsl:when test="$xpointerPath = $elemXmlNodeId and ($xpointerRange != '' or $xpointerPoint != '')"> <xsl:sequence select="$insertedXPointer"/> </xsl:when> <xsl:when test="$xpointerPath = $elemXmlNodeId and ($xpointerRange = '' and $xpointerPoint = '')"> <seg rend="highlight"> <xsl:sequence select="$thisElement"/> </seg> </xsl:when> <xsl:otherwise> <xsl:sequence select="$thisElement"/> </xsl:otherwise> </xsl:choose> </xsl:if> <xsl:if test="$extElemXPointerPoint = '.1'"> <xsl:sequence select="$extElemContent"/> </xsl:if> </xsl:template> </xsl:stylesheet>