Donaldinho: Kopie einer XML erstellen, Tag tauschen

Hallo zusammen,

als Anfänger im Bereich XML/XLST komme ich leider an einem bestimmten Punkt nicht weiter...

Ich versuche derzeit die Inhaltsdatei (content.xml) einer .odt-Datei mittels XSLT zu transformieren. Ziel ist es den Knoten office:annotation bzw. </office:annotation> zu verändern.

Die original content.xml sieht dabei wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>  
<office:document-content xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rpt="http://openoffice.org/2005/report" xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" xmlns:rdfa="http://docs.oasis-open.org/opendocument/meta/rdfa#" office:version="1.2"><office:scripts/><office:font-face-decls><style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="swiss"/><style:font-face style:name="Times New Roman" svg:font-family="&apos;Times New Roman&apos;" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Lucida Sans Unicode" svg:font-family="&apos;Lucida Sans Unicode&apos;" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="Tahoma1" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles><style:style style:name="P1" style:family="paragraph"><style:paragraph-properties fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" fo:line-height="100%" fo:text-align="start" fo:text-indent="0cm" style:text-autospace="ideograph-alpha" style:punctuation-wrap="simple" style:line-break="strict" style:writing-mode="lr-tb"><style:tab-stops/></style:paragraph-properties><style:text-properties fo:hyphenate="false"/></style:style><style:style style:name="T1" style:family="text"><style:text-properties style:use-window-font-color="true" style:text-outline="false" style:text-line-through-style="none" style:text-position="0% 100%" style:font-name="Tahoma" fo:font-size="10pt" fo:letter-spacing="normal" fo:language="en" fo:country="US" fo:font-style="normal" fo:text-shadow="none" style:text-underline-style="none" fo:font-weight="normal" style:text-underline-mode="continuous" style:text-line-through-mode="continuous" style:letter-kerning="false" style:font-name-asian="Lucida Sans Unicode" style:font-size-asian="12pt" style:language-asian="en" style:country-asian="US" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-name-complex="Tahoma1" style:font-size-complex="12pt" style:language-complex="en" style:country-complex="US" style:font-style-complex="normal" style:font-weight-complex="normal" style:text-emphasize="none" style:text-scale="100%" style:font-relief="none"/></style:style></office:automatic-styles><office:body><office:text><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="Standard">TEXT <office:annotation><dc:creator>Unbekannter Autor</dc:creator><dc:date>2009-10-07T19:42:35.01</dc:date><text:p text:style-name="P1"><text:span text:style-name="T1">NOTIZ1</text:span></text:p><text:p text:style-name="P1"><text:span text:style-name="T1">NOTIZ2</text:span></text:p><text:p text:style-name="P1"><text:span text:style-name="T1"/></text:p><text:p text:style-name="P1"><text:span text:style-name="T1">NOTIZ3</text:span></text:p></office:annotation>TEXT</text:p></office:text></office:body></office:document-content>

Mein bisheriger Ansatz lautet wie folgt:

<?xml version="1.0"?>  
<xsl:stylesheet version="1.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
    xmlns:accel="http://openoffice.org/2001/accel"  
    xmlns:chart="http://openoffice.org/2000/chart"  
    xmlns:config="http://openoffice.org/2001/config"  
    xmlns:dc="http://purl.org/dc/elements/1.1/"  
    xmlns:dlg="http://openoffice.org/2000/dialog"  
    xmlns:dr3d="http://openoffice.org/2000/dr3d"  
    xmlns:draw="http://openoffice.org/2000/drawing"  
    xmlns:event="http://openoffice.org/2001/event"  
    xmlns:fo="http://www.w3.org/1999/XSL/Format"  
    xmlns:form="http://openoffice.org/2000/form"  
    xmlns:image="http://openoffice.org/2001/image"  
    xmlns:library="http://openoffice.org/2000/library"  
    xmlns:manifest="http://openoffice.org/2001/manifest"  
    xmlns:math="http://www.w3.org/1998/Math/MathML"  
    xmlns:menu="http://openoffice.org/2001/menu"  
    xmlns:meta="http://openoffice.org/2000/meta"  
    xmlns:number="http://openoffice.org/2000/datastyle"  
    xmlns:office="http://openoffice.org/2000/office"  
    xmlns:script="http://openoffice.org/2000/script"  
    xmlns:statusbar="http://openoffice.org/2001/statusbar"  
    xmlns:style="http://openoffice.org/2000/style"  
    xmlns:svg="http://www.w3.org/2000/svg"  
    xmlns:table="http://openoffice.org/2000/table"  
    xmlns:text="http://openoffice.org/2000/text"  
    xmlns:toolbar="http://openoffice.org/2001/toolbar"  
    xmlns:xlink="http://www.w3.org/1999/xlink"  
  
<xsl:output method="xml"  
    doctype-public="-//OpenOffice.org//DTD OfficeDocument 1.0//EN"  
    doctype-system="office.dtd"/>  
  
<xsl:template match="/">  
  
<xsl:copy-of select="."/>  
  
</xsl:template>  
  
</xsl:stylesheet>  
  

Leider wird hierdurch nur eine Kopie der Datei erzeugt. Darüber hinaus würde ich jedoch noch gerne:

  1. alle office:annotation Tags umbenennen
  2. alle Tags in allen office:annotation-Knoten durch Ihre Werte (value of) ersetzen. Idealerweise durch underscore voneinander getrennt.
    Anbei ein Bild zur Verdeutlichung:

Hat jemand einen heißen Tipp für mich? Mir ist nicht klar, wie ich einen Teil der xml-Datei übernehmen kann (copy) und gleichzeitig den Knoten verändere...

Viele Grüße

Marc

  1. Hallo Donaldinho,

    Leider wird hierdurch nur eine Kopie der Datei erzeugt. Darüber hinaus würde ich jedoch noch gerne:

    1. alle office:annotation Tags umbenennen
    2. alle Tags in allen office:annotation-Knoten durch Ihre Werte (value of) ersetzen. Idealerweise durch underscore voneinander getrennt.

    Das sollte reichen:

    <?xml version="1.0" encoding="UTF-8"?>  
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
      xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0">  
      
      <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>  
      
      <xsl:template match="@* | node()">  
        <xsl:copy>  
          <xsl:apply-templates select="@* | node()"/>  
        </xsl:copy>  
      </xsl:template>  
      
      <xsl:template match="office:annotation">  
        <neueselement>  
          <xsl:for-each select="//*/text()[normalize-space(.)]">  
            <xsl:value-of select="."/>  
            <xsl:if test="position()!=last()">_</xsl:if>  
          </xsl:for-each>  
        </neueselement>  
      </xsl:template>  
      
    </xsl:stylesheet>
    

    Mit Saxon-HE 9.2 entsteht der Dokument-Klon mit dem ersetzten office:annotation-Element in der Form:

    <neueselement>TEXT _Unbekannter Autor_2009-10-07T19:42:35.01_NOTIZ1_NOTIZ2_NOTIZ3_TEXT</neueselement>

    Grüeß,
    Thomas