view software/eXist/webapp/mpdl/presentation/insertExternalElements.xsl @ 17:7e883ce72fec

diverse Fehlerbehebungen
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 27 Sep 2011 16:41:15 +0200
parents e99964f390e4
children
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="options" select="/result/options"/>
<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="options"></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="identifier" select="@*:id"/>
  <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), '&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:value-of select="''"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="thisElement">
    <xsl:choose>
      <xsl:when test="contains($options, 'withIdentifier')">
        <xsl:copy>
          <xsl:apply-templates select="attribute()"/>
          <xsl:if test="not(empty($identifier))">
            <xsl:attribute name="identifier">
              <xsl:value-of select="$identifier"/>
            </xsl:attribute>
          </xsl:if>
          <xsl:apply-templates select="element()|text()|comment()|processing-instruction()"/>
        </xsl:copy>
      </xsl:when>
      <xsl:otherwise>
        <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:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:if test="$extElemXPointerPoint = '.0'">
    <xsl:sequence select="$extElemContent"/>
  </xsl:if>
  <xsl:if test="$extElemXPointerPointInt &gt;= 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>