<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:pre="http://www.vishia.de/2006/XhtmlPre"
>

<!--  This XSLT-script is able to use especially for org.vishia.xml.docuGen.CorrectHref.java
      to show cross references to requirements. The input xml Tree is build internally inside the converting routines
      as a tree of hyper-references.
 -->

  <xsl:output method="xml" encoding="iso-8859-1"/>
  <xsl:variable name="testOutput">1</xsl:variable><!-- wenn auf 0 gesetzt dann werden keine Zusatztexte für Test
    erzeugt. -->


<xsl:template match="/">
  <xsl:variable name="content" select="/root/@crossRefContent" />
  <xsl:choose><xsl:when test="starts-with($content,'Requirements')" >
    <pre:CrossRefContent>
      <xhtml:dl>
        <xsl:for-each select="/root/*//Requirement">
        <xsl:sort select="@Ident" />  
          <xsl:variable name="ident"><xsl:text>REQ</xsl:text><xsl:value-of
            select="substring-after(substring-before(@Ident,'#DEF#'),'#REQ')" /></xsl:variable>
          <xsl:variable name="label"><xsl:text>(?$ident?)_REF</xsl:text></xsl:variable>
          <xhtml:a name="{$label}" /><!-- das Label für href hierhin -->
          <xhtml:dt id="{$label}" class="umlElement"><xsl:text>(?$ident?): (?!Titel?)</xsl:text>
          </xhtml:dt>
          <xhtml:dd>
            <xsl:if test="contains($content, '+text+')">
              <xsl:for-each select="Description/text/p">
                <xhtml:p><xsl:value-of select="." /></xhtml:p>
              </xsl:for-each>
            </xsl:if>
            <xsl:if test="not(/root/pre:HrefRoot/pre:HrefEntry[starts-with(@name,$ident)])" >
              <xhtml:p>Nicht in dieser Spezifikation behandelt. </xhtml:p>
            </xsl:if>
            <xsl:for-each select="/root/pre:HrefRoot/pre:HrefEntry[starts-with(@name,$ident)]">
              <xhtml:p>Behandelt in:</xhtml:p>
              <xhtml:ul>
                <xsl:for-each select="Backref">
                  <xsl:variable name="href">#<xsl:value-of select="@href" /></xsl:variable>
                  <xhtml:li>
                    <xhtml:p>
                      <xhtml:a href="{$href}"><xsl:text>(?@chapter-href?) (?@chapter-title?)</xsl:text></xhtml:a>
                      <xsl:if test="contains($content, '+div+')">
                        <xsl:if test="@div-href">
                          <xsl:text>: (?@div-href?)</xsl:text>
                        </xsl:if>  
                      </xsl:if>
                    </xhtml:p>
                  </xhtml:li>
                </xsl:for-each>
              </xhtml:ul>
            </xsl:for-each>
          </xhtml:dd>
        </xsl:for-each>      
      </xhtml:dl>
    </pre:CrossRefContent>

  </xsl:when><xsl:when test="$content='Req-old'">
    <pre:CrossRefContent>
        <xhtml:dl>
        <xsl:for-each select="/root/pre:HrefRoot/pre:HrefEntry[starts-with(@name,'REQ')]">
          <xsl:variable name="label" select="substring-before(@name,'_REF')" />
          <!-- XML-Inputelement Requirement suchen und in variable speichern:-->
          <xsl:variable name="requirement" select="/root/Requirements//Requirement[contains(@Ident,$label)]" />
          <xhtml:a name="{@name}" /><!-- @name ist das Label für href hierhin -->
          <xhtml:dt id="{@name}" class="umlElement"><xsl:text></xsl:text><xsl:value-of select="@name" /><xsl:text>:
            </xsl:text>
            <!-- xsl:value-of select="$label" / -->
            <xsl:value-of select="$requirement/Titel" />
          </xhtml:dt>
          <xhtml:dd>
            <xhtml:p class="caption_p"><xsl:text>Aufgeführt in Kapitel:</xsl:text></xhtml:p>
            <xhtml:ul>
              <xsl:for-each select="Backref">
                <xhtml:li>
                  <xhtml:p>
                    <xsl:variable name="href">#<xsl:value-of select="@chapter-href" /></xsl:variable>
                      <xhtml:a href="{$href}"><xsl:value-of select="@chapter-title" /></xhtml:a>
                  </xhtml:p>
                </xhtml:li>
              </xsl:for-each>
            </xhtml:ul>
          </xhtml:dd>
        </xsl:for-each>
      </xhtml:dl>
    </pre:CrossRefContent>
  </xsl:when><xsl:when test="$content='TestCrossRef'">
    <pre:CrossRefContent>
        <xhtml:ul>
          <xsl:for-each select="/root/pre:HrefRoot/pre:HrefEntry">
            <xhtml:li><xsl:text>(?@name?)</xsl:text>
              <xhtml:ul>
                <xsl:for-each select="Backref"><xhtml:li><xsl:text> - (?@chapter-href?) :
                  (?@chapter-title?)</xsl:text></xhtml:li></xsl:for-each>
              </xhtml:ul>
            </xhtml:li>    
          </xsl:for-each>
        </xhtml:ul>
      </pre:CrossRefContent>  
  </xsl:when><xsl:otherwise>
    <pre:noCrossRefContent />
  </xsl:otherwise></xsl:choose>
</xsl:template>









<xsl:template match="xx/xx">
  <xsl:apply-templates select="/root/CrossRefRoot" />
</xsl:template>

<xsl:template match="CrossRefRoot">
  <xsl:if test="count(CrossRef)>0">
    <xhtml:dl>
      <xsl:for-each select="CrossRef">
        <xhtml:dt><xsl:value-of select="@anchor" />
        </xhtml:dt>
        <xhtml:dd>
          <xhtml:ul>
            <xsl:for-each select="Backref">
              <xhtml:li>
                <xhtml:p>
                  <xsl:variable name="href">#<xsl:value-of select="@chapter-href" /></xsl:variable>
                  <xhtml:a href="{$href}"><xsl:value-of select="@chapter-title" /></xhtml:a>
                </xhtml:p>
              </xhtml:li>
            </xsl:for-each>
          </xhtml:ul>
        </xhtml:dd>
      </xsl:for-each>
    </xhtml:dl>
  </xsl:if>
</xsl:template>


	<xsl:template match="xxx">
  <ReqCrossRef>xxxTest<xsl:value-of select="/root/@forHref" />

    <!-- xsl:apply-templates select="/root//Requirements/Requirement | /root//NewRequirements/Requirement">
      <xsl:sort select="@Ident" />
    </xsl:apply-templates -->
  </ReqCrossRef>
	</xsl:template>




	<xsl:template name="Requirement">
	  <!-- Bereinigung des Ident weil vor- und nach-Leerzeichen auftreten: -->
    <xsl:variable name="label1"><xsl:text>REQ(?!substring-after(@Ident,'#REQ')?)</xsl:text></xsl:variable>
    <xsl:variable name="label"><xsl:text>(?!substring-before($label1,'#DEF#')?)#DEF#</xsl:text></xsl:variable>
    <xhtml:dl>
      <xhtml:a name="{$label}" />
      <xhtml:dt id="{$label}"><xsl:text>(?$label?): (?!Titel?)</xsl:text></xhtml:dt>
      <xhtml:dd><xsl:apply-templates select="Description/text/*" /></xhtml:dd>
      <!-- xsl:call-template name="searchReferences">
        <xsl:with-param name="reqIdent" select="@Ident"/>
      </xsl:call-template -->
    </xhtml:dl>
	</xsl:template>

	<xsl:template match="p">
	  <xhtml:p><xsl:apply-templates /></xhtml:p>
	</xsl:template>





  <xsl:template name="searchReferences">
  <xsl:param name="reqIdent"/>
    <info><xsl:value-of select="$reqIdent"/></info>
      <xsl:for-each select="/root/SwComponententSpec/Structure/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'Structure'"/>
        </xsl:call-template>
      </xsl:for-each>
      <xsl:for-each select="/root/SwComponententSpec/Algorithms/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'Algorithms'"/>
        </xsl:call-template>
      </xsl:for-each>
      <xsl:for-each select="/root/SwComponententSpec/Interfaces/*/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'Interfaces'"/>
        </xsl:call-template>
      </xsl:for-each>
      <xsl:for-each select="/root/SwComponententSpec/Moduls/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'Moduls'"/>
        </xsl:call-template>
      </xsl:for-each>
      <xsl:for-each select="/root/SwComponententSpec/SwEngeneering/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'SwEngeneering'"/>
        </xsl:call-template>
      </xsl:for-each>
      <xsl:for-each select="/root/SwComponententSpec/Documentation/topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath" select="'Documentation'"/>
        </xsl:call-template>
      </xsl:for-each>
  </xsl:template>


  <xsl:template name="searchReferencesInTopic">
  <xsl:param name="reqIdent"/>
  <xsl:param name="titlePath"/><!-- path of the titles of the nested topics -->
    <!-- info2><xsl:value-of select="$reqIdent"/></info2 -->
    <!-- ident><xsl:value-of select="$titlePath"/></ident -->
    <!-- Reqxxx><xsl:value-of select="tag[@name='ReqRef']/@value"/></Reqxxx -->
    <xsl:variable name="titlePathOwn"><xsl:value-of select="$titlePath"/>/<xsl:value-of select="@ident"/></xsl:variable>
    <xsl:if test="tag[@name='ReqRef']/@value = $reqIdent">
      <ReferencedIn label="{@label}" titlepath="{$titlePathOwn}"><xsl:value-of select="@title"/></ReferencedIn>
    </xsl:if>
      <xsl:for-each select="topic">
        <xsl:call-template name="searchReferencesInTopic">
          <xsl:with-param name="reqIdent" select="$reqIdent"/>
          <xsl:with-param name="titlePath"><xsl:value-of select="$titlePathOwn"/></xsl:with-param>
        </xsl:call-template>
      </xsl:for-each>
  </xsl:template>







</xsl:stylesheet>