Announcement

Collapse
No announcement yet.

xsl: xml umformung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • xsl: xml umformung

    Hallo zusammen!

    Ich habe ein docbook xml Dokument, welches ich gerne mit xsl umformen möchte, wobei der output genauso sein sollte wie das original xml Dokument. Es sollen lediglich einige attribute ersetzt werden.
    Mein Xml Dokument sieht wie folgt aus:

    Code:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
    <!--  .............. Dummy Kapitel ................  -->
    <chapter>
    	<title>Dummy Kapitel</title>
    	<para>Text Text Text Text Text Text Text  TeText Text Text Text</para>
    	<section id="blabla">
    		<title>Erste Section</title>
    		<para>Text Text Text TeText Text Text Text Textext Text Text<xref linkend="blabla"/> Text Text Teext Text Text </para>
    		<section id="123">
    			<title>Erste Untersection</title>
    			<para>Text Text Text <xref linkend="123"/>Text Text Text Text TeText Text<xref linkend="test_test"/> Text Text Text Tet Text </para>
    		</section>
    	</section>
    </chapter>
    Ich möchte alle <xref> auf ihre linkend attribute prüfen und testen ob es eine (egal wo im Dokument) passende id, sprich mit dem gleichen wert gibt. Wenn dem nicht so ist wie im Falle von <xref linkend="test_test"/> soll entweder der Wert in diesem Fall "test_test" durch einen anderen Wert ersetzt werden oder das ganze <xref>-tag soll durch Klartext ersetzt werden.

    Das heisst mein Code sollte dann so aussehen(wobei "XXXXXXXXXXXXXXXX" die einzige Änderung in diesem Fall ist.

    Code:
    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
    <!--  .............. Dummy Kapitel ................  -->
    <chapter>
    	<title>Dummy Kapitel</title>
    	<para>Text Text Text Text Text Text Text  TeText Text Text Text</para>
    	<section id="blabla">
    		<title>Erste Section</title>
    		<para>Text Text Text TeText Text Text Text Textext Text Text<xref linkend="blabla"/> Text Text Teext Text Text </para>
    		<section id="123">
    			<title>Erste Untersection</title>
    			<para>Text Text Text <xref linkend="123"/>Text Text Text Text TeText TextXXXXXXXXXXXXXXXX Text Text Text Tet Text </para>
    		</section>
    	</section>
    </chapter>
    Weiss irgendjemand wie der code für das xsl Dokument ausschauen muss, damit ich mein Ziel erreiche?
    Zuletzt editiert von mastafue; 17.09.2008, 15:38. Reason: verbesserung

  • #2
    lösung und weitere fragen

    mittlerweile bin ich selber auf die lösung gekommen. das xsl Dokument muss wie folgt aussehen:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" doctype-public="-//OASIS//DTD DocBook XML V4.4//EN" standalone="no" indent="yes"/>
    
    	<xsl:template match="@* | node()">
    		<xsl:copy>
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
    
    	<xsl:template match="xref">
    		<xsl:if test="@linkend != //*[@id]"><xref linkend="ERSATZ"/></xsl:if>
    	</xsl:template>
    	
    </xsl:stylesheet>
    mein erstes problem ist das mein if bedingung alle xref's ersetzt:
    <xsl:if test="@linkend != //*[@id]">

    Ich möchte aber, dass diese Anweisung nur diejenigen xrefs ersetzt die keine gleiche id im Dokument haben. Sprich wenn der wert von dem attribut linkend keinem anderen id wert im dokument entspricht, soll der wert von linkend geändert werden. wie erreiche ich das?

    mein 2. problem besteht darin, dass mir etwas im output fehlt. der kopf meines outputs schaut wie folgt aus:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" ""><!--  .............. Dummy Kapitel ................  -->
    Ich möchte gerne, dass an dieser stelle:

    chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" ""

    in den 2. anführungszeichen folgendes steht:

    "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd

    wie erreiche ich das?

    ich hoffe jemand weiss die lösung.

    Vielen dank schon mal im voraus!

    Comment


    • #3
      1. problem gelöst 2. besteht nach wie vor

      habe das 1. problem gelöst der code schaut wie folgt aus

      Code:
      <?xml version="1.0" encoding="ISO-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      
      	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" doctype-public="-//OASIS//DTD DocBook XML V4.4//EN" standalone="no" indent="yes"/>
      
      	<xsl:variable name="idvalue">
      		<xsl:value-of select="//chapter/@id | //section/@id | //figure/@id"/>
      	</xsl:variable>
      
      	<xsl:template match="@* | node()">
      		<xsl:copy>
      			<xsl:apply-templates select="@* | node()"/>
      		</xsl:copy>
      	</xsl:template>
      
      	<xsl:template match="xref">
      		<xsl:copy>
      		<xsl:apply-templates select="@* | node()"/>
      		
      			<xsl:if test="@linkend != $idvalue">
      				<xsl:attribute name="linkend">
      					<xsl:text>!!!ERSATZLINK!!!</xsl:text>
      				</xsl:attribute>
      			</xsl:if>	 	
      			
      		</xsl:copy>
      	</xsl:template>
      	
      </xsl:stylesheet>
      das 2. problem siehe oben besteht nach wie vor. ich hoffe es kann mir dabei jemand helfen.

      Comment


      • #4
        2. problem gelöst

        so habe alle probleme gelöst. der code für das 2. problem sieht wie folgt aus:

        Code:
        	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" doctype-public="-//OASIS//DTD DocBook XML V4.4//EN" doctype-system="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" standalone="no" indent="yes"/>
        das doctype-system="http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd" hat mir noch gefehlt^^

        der output kopf schaut dann nämlich so aus

        Code:
        <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">
        so thema ist abgeschlossen=)

        Comment

        Working...
        X