Kopie einer XML erstellen, Tag tauschen
Donaldinho
- xsl
0 ThomasM
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="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Lucida Sans Unicode" svg:font-family="'Lucida Sans Unicode'" 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:
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
Hallo Donaldinho,
Leider wird hierdurch nur eine Kopie der Datei erzeugt. Darüber hinaus würde ich jedoch noch gerne:
- alle office:annotation Tags umbenennen
- 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