First, for each XML file within the "repo" folder create an acompaning file with a ".meta" extension like the "step4" example is doing:
<?xml version="1.0" encoding="UTF-8"?> <metapage> <author>me</author> <category>catb</category> <state>edited</state> </metapage>
Add 2 additional match nodes to your pipeline:
<map:match pattern="page/**"> <map:aggregate element="aggregation" label="content"> <map:part src="cocoon:/raw/{1}"/> <map:part src="cocoon:/meta/{1}"/> </map:aggregate> <map:serialize type="xml"/> </map:match> <map:match pattern="meta/**"> <map:generate src="{global:staging}repo/{1}.meta"/> <map:serialize type="xml"/> </map:match>
Now create 2 additional files within the "authentic" folder, aggregation.xsd (the XML schema)
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="aggregation"> <xs:complexType> <xs:sequence> <xs:element ref="page" minOccurs="1" maxOccurs="1"/> <xs:element ref="metapage" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="page"> <xs:complexType> <xs:sequence> <xs:element ref="title"/> <xs:element ref="content"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="content"> <xs:complexType> <xs:sequence> <xs:element ref="para" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="title" type="xs:string"/> <xs:element name="para"> <xs:complexType mixed="true"> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="emphasis" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="image" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="link" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="emphasis"> <xs:complexType mixed="true"/> </xs:element> <xs:element name="image"> <xs:complexType> <xs:attribute name="href" type="xs:string" use="required"/> <xs:attribute name="height" type="xs:long"/> <xs:attribute name="width" type="xs:long"/> </xs:complexType> </xs:element> <xs:element name="link"> <xs:complexType mixed="true"> <xs:attribute name="href" type="xs:string" use="required"/> </xs:complexType> </xs:element> <xs:element name="metapage"> <xs:complexType> <xs:sequence> <xs:element ref="author" minOccurs="1" maxOccurs="1"/> <xs:element ref="category" minOccurs="1" maxOccurs="1"/> <xs:element ref="state" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="author" type="xs:string"/> <xs:element name="category" type="xs:string"/> <xs:element name="state" type="xs:string"/> </xs:schema>
and aggregation.sps (the authetic-specific stylesheet)
<?xml version="1.0" encoding="UTF-8"?> <structure version="2" schemafile="aggregation.xsd" workingxmlfile="" templatexmlfile=""> <nspair prefix="xs" uri="http://www.w3.org/2001/XMLSchema"/> <template> <match overwrittenxslmatch="/"/> <children> <template> <match match="aggregation"/> <children> <template> <match match="metapage"/> <children> <xpath allchildren="1"/> </children> </template> <newline/> <newline/> <template> <match match="page"/> <children> <template> <match match="title"/> <children> <xpath allchildren="1"> <styles color="#0000A0" font-size="larger" font-weight="bold" text-decoration="underline"/> </xpath> </children> </template> <template> <match match="content"/> <children> <template> <match match="para"/> <children> <paragraph paragraphtag="p"> <children> <xpath allchildren="1"/> </children> </paragraph> </children> </template> </children> </template> </children> </template> </children> </template> </children> </template> <template> <match match="author"/> <children> <text fixtext="Author: "/> <field ownvalue="1"> <properties size="19" value=""/> </field> <newline/> <newline/> </children> </template> <template> <match match="category"/> <children> <text fixtext="Category: "/> <select ownvalue="1"> <properties size="0"/> <selectoption description="Cat A" value="cata"/> <selectoption description="Cat B" value="catb"/> <selectoption description="Cat C" value="catc"/> </select> <newline/> <newline/> </children> </template> <template> <match match="emphasis"/> <children> <xpath allchildren="1"> <styles font-weight="bold"/> </xpath> </children> </template> <template> <match match="image"/> <children> <image> <properties border="0"/> <imagesource> <xpath value="@href"/> </imagesource> </image> </children> </template> <template> <match match="link"/> <children> <link> <hyperlink> <xpath value="@href"/> </hyperlink> <children> <xpath allchildren="1"/> </children> </link> </children> </template> <template> <match match="metapage"/> <children> <newline/> <template> <match match="author"/> <children> <xpath allchildren="1"/> </children> </template> <newline/> <template> <match match="category"/> <children> <xpath allchildren="1"/> </children> </template> <newline/> <template> <match match="state"/> <children> <xpath allchildren="1"/> </children> </template> <newline/> </children> </template> <template> <match match="page"/> <children> <xpath allchildren="1"/> </children> </template> <template> <match match="state"/> <children> <text fixtext="State: "/> <select ownvalue="1"> <properties size="0"/> <selectoption description="New" value="new"/> <selectoption description="Edited" value="edited"/> <selectoption description="Reviewed" value="reviewed"/> <selectoption description="Released" value="released"/> </select> <newline/> <newline/> </children> </template> </structure>
Now change your "file2html.xsl" stylesheet to reference these files instead of "content.xsd" and "content.sps".
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="file"></xsl:param> <xsl:param name="sitemapURI"></xsl:param> <xsl:param name="requestURI"></xsl:param> <xsl:param name="serverName"></xsl:param> <xsl:param name="serverPort"></xsl:param> <xsl:template match="/page"> <html> <body> <OBJECT id="objPlugIn" Classid="clsid:46987108-BA64-4fd1-A947-1BF7DA938FC0" width="700" height="500"> <xsl:attribute name="CodeBase">http://<xsl:value-of select="$serverName"/>:<xsl:value-of select="$serverPort"/><xsl:value-of select="substring-before($requestURI, $sitemapURI)"/>authentic/AuthenticBrowserEdition.cab</xsl:attribute> <PARAM NAME="LicKey" VALUE="<YOUR LICENSE KEY>"/> <PARAM NAME="LicServer"> <xsl:attribute name="VALUE">http://<xsl:value-of select="$serverName"/></xsl:attribute> </PARAM> <PARAM NAME="XMLDataURL"> <xsl:attribute name="VALUE">http://<xsl:value-of select="$serverName"/>:<xsl:value-of select="$serverPort"/><xsl:value-of select="substring-before($requestURI, $sitemapURI)"/>raw/<xsl:value-of select="$file"/></xsl:attribute> </PARAM> <PARAM NAME="XMLDataSaveURL"> <xsl:attribute name="VALUE">http://<xsl:value-of select="$serverName"/>:<xsl:value-of select="$serverPort"/><xsl:value-of select="substring-before($requestURI, $sitemapURI)"/>write/<xsl:value-of select="$file"/></xsl:attribute> </PARAM> <PARAM NAME="SPSDataURL"> <xsl:attribute name="VALUE">http://<xsl:value-of select="$serverName"/>:<xsl:value-of select="$serverPort"/><xsl:value-of select="substring-before($requestURI, $sitemapURI)"/>authentic/aggregation.sps</xsl:attribute> </PARAM> <PARAM NAME="SchemaDataURL"> <xsl:attribute name="VALUE">http://<xsl:value-of select="$serverName"/>:<xsl:value-of select="$serverPort"/><xsl:value-of select="substring-before($requestURI, $sitemapURI)"/>authentic/aggregation.xsd</xsl:attribute> </PARAM> <PARAM NAME="EntryHelpersEnabled" VALUE="TRUE"/> <PARAM NAME="EntryHelperWindows" VALUE="3"/> </OBJECT> <br/> <input type="button" name="submit1" value="Save" onClick="objPlugIn.SavePOST()"/> </body> </html> </xsl:template> </xsl:stylesheet>
Now you already can edit your meta data together with your XML document. Adjust your "stream2write.xsl" stylesheet to separate the data and metadata down the pipeline again:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:req="http://apache.org/cocoon/request/2.0" xmlns:source="http://apache.org/cocoon/source/1.0"> <xsl:param name="file"></xsl:param> <xsl:template match="/aggregation"> <page> <xsl:apply-templates/> </page> </xsl:template> <xsl:template match="page"> <source:write create="true"> <source:source><xsl:value-of select="$file"/></source:source> <source:fragment> <xsl:copy-of select="."/> </source:fragment> </source:write> </xsl:template> <xsl:template match="metapage"> <source:write create="true"> <source:source><xsl:value-of select="$file"/>.meta</source:source> <source:fragment> <xsl:copy-of select="."/> </source:fragment> </source:write> </xsl:template> </xsl:stylesheet>
Adjust your sitemap to exclude your ".meta" files from folder traversal like the "step4" sample is doing.