diff software/eXist/webapp/mpdl/presentation/insertExternalElements.xsl @ 13:469d927b9ca7

diverse Fehlerbehebungen
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 19 Apr 2011 16:51:59 +0200
parents 1ec29fdd0db8
children e99964f390e4
line wrap: on
line diff
--- a/software/eXist/webapp/mpdl/presentation/insertExternalElements.xsl	Tue Apr 19 16:51:26 2011 +0200
+++ b/software/eXist/webapp/mpdl/presentation/insertExternalElements.xsl	Tue Apr 19 16:51:59 2011 +0200
@@ -11,6 +11,58 @@
 <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">
@@ -19,8 +71,8 @@
 <xsl:template match="fragment">
   <xsl:apply-templates/>
 </xsl:template>
-<xsl:template match="externalElements">
-</xsl:template>
+<xsl:template match="externalElements"></xsl:template>
+<xsl:template match="xpointer"></xsl:template>
 
 <xsl:template match="attribute()|text()|comment()|processing-instruction()">
   <xsl:copy>
@@ -35,46 +87,47 @@
   <xsl:variable name="extElemIndex" select="index-of($extElemXmlNodeIds, $elemXmlNodeId)"/>
   <xsl:variable name="extElem" select="$externalElements/*[$extElemIndex]"/>
   <xsl:variable name="extElemContent" select="$extElem/content/*[1]"/>
-  <xsl:variable name="extElemContentSerialized" select="saxon:serialize($extElemContent, 'myXml')"/>
-  <xsl:variable name="before">
+  <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="empty($extElem/@before) or $extElem/@before = ''">
-        <xsl:value-of select="''"/>
+      <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="string($extElem/@before)"/>
+        <xsl:value-of select="xs:integer(-1)"/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:variable>
-  <xsl:variable name="charPos">
+  <xsl:variable name="insertedXPointer">
     <xsl:choose>
-      <xsl:when test="empty($extElem/@charPos) or $extElem/@charPos = ''">
-        <xsl:value-of select="xs:integer(-1)"/>
+      <xsl:when test="$xpointerRange != ''">
+        <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/>
+        <xsl:variable name="tmp" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $elemSerialized, string($xpointerRangeFrom), '&lt;seg rend=&quot;highlight&quot;&gt;')"/>
+        <xsl:variable name="tmp2" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $tmp, string($xpointerRangeTo), '&lt;/seg&gt;')"/>
+        <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="'&lt;bla&gt;'"/><xsl:value-of select="'&lt;seg rend=&quot;highlightPoint&quot;/&gt;'"/><xsl:value-of select="$elemSerialized"/><xsl:value-of select="'&lt;/bla&gt;'"/>
+        <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="'&lt;bla&gt;'"/><xsl:value-of select="$elemSerialized"/><xsl:value-of select="'&lt;seg rend=&quot;highlightPoint&quot;/&gt;'"/><xsl:value-of select="'&lt;/bla&gt;'"/>
+        <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), '&lt;seg rend=&quot;highlightPoint&quot;/&gt;')"/>
+        <xsl:sequence select="saxon:parse($tmp)"/>
       </xsl:when>
       <xsl:otherwise>
-        <xsl:sequence select="xs:integer($extElem/@charPos)"/>
+        <xsl:value-of select="''"/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:variable>
-  <xsl:variable name="elemSerialized" select="saxon:serialize(., 'myXml')"/>
-  <xsl:variable name="insertedElemSerialized" select="mpdlxmlutil:insertAtCharPos(mpdlxmlutil:new(), $elemSerialized, string($charPos), $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:if test="$charPos &lt; 0 and $before = 'true'">
-    <xsl:sequence select="$extElemContent"/>
-  </xsl:if>
-  <xsl:if test="$charPos &gt;= 0">
-    <xsl:sequence select="$insertedElemDeSerialized"/>
-  </xsl:if>
-  <xsl:if test="$charPos &lt; 0">
+  <xsl:variable name="thisElement">
     <xsl:copy>
       <xsl:apply-templates select="attribute()"/>
       <xsl:attribute name="xmlNodeId">
@@ -82,8 +135,43 @@
       </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="$charPos &lt; 0 and $before = 'false'">
+  <xsl:if test="$extElemXPointerPointInt &gt;= 0">
+    <xsl:variable name="extElemContent" select="$extElem/content/*[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>