/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.markup.transformer;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.markup.MarkupResourceStream;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
/**
* A container which output markup will be processes by a XSLT processor prior to writing the output
* into the web response. The *.xsl resource must be located in the same path as the nearest parent
* with an associated markup and must have a filename equal to the component's id.
* <p>
* The containers tag will be the root element of the xml data applied for transformation to ensure
* the xml data are well formed (single root element). In addition the attribute <code>xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd</code>
* is added to the root element to allow the XSL processor to handle the wicket namespace.
* <p>
* Similar to this container, a <code>IBehavior</code> is available which does the same, but does
* not require an additional Container.
*
* @see org.apache.wicket.markup.transformer.XsltTransformerBehavior
*
* @author Juergen Donnerstag
*/
public class XsltOutputTransformerContainer extends AbstractOutputTransformerContainer
{
private static final long serialVersionUID = 1L;
/** An optional xsl file path */
private final String xslFile;
/**
* Instead of using the default mechanism to determine the associated XSL file, it is given by
* the user.
*
* @see org.apache.wicket.Component#Component(String, IModel)
*
* @param id
* the wicket:id
* @param model
* the model (unused)
* @param xslFilePath
* XSL input file path
*/
public XsltOutputTransformerContainer(final String id, final IModel<?> model,
final String xslFilePath)
{
super(id);
xslFile = xslFilePath;
// The containers tag will be transformed as well. Thus we make sure that
// the xml provided to the xsl processor is well formed (has a single
// root element)
setTransformBodyOnly(false);
// Make the XSLT processor happy and allow him to handle the wicket
// tags and attributes which are in the wicket namespace
add(AttributeModifier.replace("xmlns:wicket",
Model.of(MarkupResourceStream.WICKET_XHTML_DTD)));
}
/**
* Construct
*
* @param id
* the wicket:id
* @param model
* the model (unused)
* @see org.apache.wicket.Component#Component(String, IModel)
*/
public XsltOutputTransformerContainer(final String id, final IModel<?> model)
{
this(id, model, null);
}
/**
* Construct
*
* @param id
* the wicket:id
* @see org.apache.wicket.Component#Component(String)
*/
public XsltOutputTransformerContainer(final String id)
{
this(id, null, null);
}
@Override
public CharSequence transform(final Component component, final CharSequence output)
throws Exception
{
return new XsltTransformer(xslFile).transform(component, output);
}
}