Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

## org.apache.struts2.views.xslt
Class XSLTResult

    java.lang.Object
      org.apache.struts2.views.xslt.XSLTResult

All Implemented Interfaces:
  Result, Serializable

    public class XSLTResult

extends Object
implements Result

XSLTResult uses XSLT to transform action object to XML. Recent version has been specifically modified to deal with Xalan flaws. When using Xalan you may notice that even though you have very minimal stylesheet like this one

     <xsl:template match="/result">
       <result />
     </xsl:template>

then Xalan would still iterate through every property of your action and it's all descendants.

If you had double-linked objects then Xalan would work forever analysing infinite object tree. Even if your stylesheet was not constructed to process them all. It's becouse current Xalan eagerly and extensively converts everything to it's internal DTM model before further processing.

Thet's why there's a loop eliminator added that works by indexing every object-property combination during processing. If it notices that some object's property were already walked through, it doesn't get any deeper. Say, you have two objects x and y with the following properties set (pseudocode):

     x.y = y;
     and
     y.x = x;
     action.x=x;

Due to that modification the resulting XML document based on x would be:

     <result>
       <x>
         <y/>
       </x>
     </result>

Without it there would be an endless x/y/x/y/x/y/... elements.

The XSLTResult code tries also to deal with the fact that DTM model is built in a manner that childs are processed before siblings. The result is that if there is object x that is both set in action's x property, and very deeply under action's a property then it would only appear under a, not under x. That's not what we expect, and that's why XSLTResult allows objects to repeat in various places to some extent.

Sometimes the object mesh is still very dense and you may notice that even though you have relatively simple stylesheet execution takes a tremendous amount of time. To help you to deal with that obstacle of Xalan you may attach regexp filters to elements paths (xpath).

Note: In your .xsl file the root match must be named `result`.
This example will output the username by using `getUsername` on your action class:

     <xsl:template match="result">
       <html>
       <body>
       Hello <xsl:value-of select="username"/> how are you?
       </body>
       <html>
     <xsl:template/>

In the following example the XSLT result would only walk through action's properties without their childs. It would also skip every property that has "hugeCollection" in their name. Element's path is first compared to excludingPattern - if it matches it's no longer processed. Then it is compared to matchingPattern and processed only if there's a match.

     <result name="success" type="xslt">
       <param name="location">foo.xslt</param>
       <param name="matchingPattern">^/result/[^/*]$</param>
       <param name="excludingPattern">.*(hugeCollection).*</param>
     </result>

In the following example the XSLT result would use the action's user property instead of the action as it's base document and walk through it's properties. The exposedValue uses an ognl expression to derive it's value.

     <result name="success" type="xslt">
       <param name="location">foo.xslt</param>
       <param name="exposedValue">user$</param>
     </result>

* This result type takes the following parameters:

- location (default) - the location to go to after execution.
- parse - true by default. If set to false, the location param will not be parsed for Ognl expressions.
- matchingPattern - Pattern that matches only desired elements, by default it matches everything.
- excludingPattern - Pattern that eliminates unwanted elements, by default it matches none.

`struts.properties` related configuration:

- struts.xslt.nocache - Defaults to false. If set to true, disables stylesheet caching. Good for development, bad for production.

Example:

     <result name="success" type="xslt">foo.xslt</result>

See Also:
  Serialized Form

Field Summary
`private AdapterFactory` | `adapterFactory`
`static String` | `DEFAULT_PARAM` 'stylesheetLocation' parameter.
`private String` | `exludingPattern` Indicates the property name patterns which should be excluded from the xml.
`private String` | `exposedValue` Indicates the ognl expression respresenting the bean which is to be exposed as xml.
`private static Log` | `LOG` Log instance for this result.
`private String` | `matchingPattern` Indicates the property name patterns which should be exposed to the xml.
`protected boolean` | `noCache` Determines whether or not the result should allow caching.
`private boolean` | `parse`
`private static long` | `serialVersionUID`
`private String` | `stylesheetLocation` Indicates the location of the xsl template.
`private static Map<String,Templates>` | `templatesCache` Cache of all tempaltes.

Constructor Summary
`XSLTResult()`
`XSLTResult(String stylesheetLocation)`

Method Summary
`void` | `execute(ActionInvocation invocation)` Represents a generic interface for all action execution results, whether that be displaying a webpage, generating an email, sending a JMS message, etc.
`protected AdapterFactory` | `getAdapterFactory()`
`protected Source` | `getDOMSourceForStack(Object value)`
`String` | `getExludingPattern()`
`String` | `getExposedValue()`
`String` | `getMatchingPattern()`
`String` | `getStylesheetLocation()`
`protected Templates` | `getTemplates(String path)`
`protected URIResolver` | `getURIResolver()` Get the URI Resolver to be called by the processor when it encounters an xsl:include, xsl:import, or document() function.
`protected void` | `setAdapterFactory(AdapterFactory adapterFactory)`
`void` | `setExludingPattern(String exludingPattern)`
`void` | `setExposedValue(String exposedValue)`
`void` | `setLocation(String location)` Deprecated. Use #setStylesheetLocation(String)
`void` | `setMatchingPattern(String matchingPattern)`
`void` | `setNoCache(String val)`
`void` | `setParse(boolean parse)` If true, parse the stylesheet location for OGNL expressions.
`void` | `setStylesheetLocation(String location)`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### serialVersionUID

    private static final long serialVersionUID

See Also:
  Constant Field Values

### LOG

    private static final Log LOG

  Log instance for this result.

### DEFAULT_PARAM

    public static final String DEFAULT_PARAM

  'stylesheetLocation' parameter. Points to the xsl.

  See Also:
    Constant Field Values

### templatesCache

    private static final Map<String,Templates> templatesCache

  Cache of all tempaltes.

### noCache

    protected boolean noCache

  Determines whether or not the result should allow caching.

### stylesheetLocation

    private String stylesheetLocation

  Indicates the location of the xsl template.

### matchingPattern

    private String matchingPattern

  Indicates the property name patterns which should be exposed to the xml.

### exludingPattern

    private String exludingPattern

  Indicates the property name patterns which should be excluded from the xml.

### exposedValue

    private String exposedValue

  Indicates the ognl expression respresenting the bean which is to be exposed as xml.

### parse

    private boolean parse

### adapterFactory

    private AdapterFactory adapterFactory

Constructor Detail

### XSLTResult

    public XSLTResult()

### XSLTResult

    public XSLTResult(String stylesheetLocation)

Method Detail

### setNoCache

    public void setNoCache(String val)

### setLocation

    public void setLocation(String location)

  Deprecated. Use #setStylesheetLocation(String)

### setStylesheetLocation

    public void setStylesheetLocation(String location)

### getStylesheetLocation

    public String getStylesheetLocation()

### getExposedValue

    public String getExposedValue()

### setExposedValue

    public void setExposedValue(String exposedValue)

### getMatchingPattern

    public String getMatchingPattern()

### setMatchingPattern

    public void setMatchingPattern(String matchingPattern)

### getExludingPattern

    public String getExludingPattern()

### setExludingPattern

    public void setExludingPattern(String exludingPattern)

### setParse

    public void setParse(boolean parse)

  If true, parse the stylesheet location for OGNL expressions.

  Parameters:
    `parse` -

### execute

    public void execute(ActionInvocation invocation)
                 throws Exception

  Description copied from interface: `Result`
  Represents a generic interface for all action execution results, whether that be displaying a webpage, generating an email, sending a JMS message, etc.

  Specified by:
    `execute` in interface `Result`
  Throws:
    `Exception`

### getAdapterFactory

    protected AdapterFactory getAdapterFactory()

### setAdapterFactory

    protected void setAdapterFactory(AdapterFactory adapterFactory)

### getURIResolver

    protected URIResolver getURIResolver()

  Get the URI Resolver to be called by the processor when it encounters an xsl:include, xsl:import, or document() function. The default is an instance of ServletURIResolver, which operates relative to the servlet context.

### getTemplates

    protected Templates getTemplates(String path)
                              throws TransformerException,
                                     IOException

  Throws:
    `TransformerException`
    `IOException`

### getDOMSourceForStack

    protected Source getDOMSourceForStack(Object value)
                                   throws IllegalAccessException,
                                          InstantiationException

  Throws:
    `IllegalAccessException`
    `InstantiationException`

Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

Copyright © 2000-2007 Apache Software Foundation. All Rights Reserved.