org.apache.struts2.views.xslt
类 XSLTResult

java.lang.Object
  继承者 org.apache.struts2.views.xslt.XSLTResult
所有已实现的接口:
com.opensymphony.xwork2.Result, Serializable

public class XSLTResult
extends Object
implements com.opensymphony.xwork2.Result

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

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

Xalan would still iterate through every property of your action and all its descendants.

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

That'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 was already walked through, it doesn't go 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 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 children 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 a 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:

struts.properties related configuration:

Example:

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

另请参见:
序列化表格

字段摘要
static String DEFAULT_PARAM
          'stylesheetLocation' parameter.
 
构造方法摘要
XSLTResult()
           
XSLTResult(String stylesheetLocation)
           
 
方法摘要
 void execute(com.opensymphony.xwork2.ActionInvocation invocation)
           
 String getExcludingPattern()
          已过时。 Since 2.1.1
 String getExposedValue()
           
 String getMatchingPattern()
          已过时。 Since 2.1.1
 String getStatus()
           
 String getStylesheetLocation()
           
 void setExcludingPattern(String excludingPattern)
          已过时。 Since 2.1.1
 void setExposedValue(String exposedValue)
           
 void setLocation(String location)
          已过时。 Use #setStylesheetLocation(String)
 void setMatchingPattern(String matchingPattern)
          已过时。 Since 2.1.1
 void setNoCache(String val)
           
 void setParse(boolean parse)
          If true, parse the stylesheet location for OGNL expressions.
 void setStatus(String status)
           
 void setStylesheetLocation(String location)
           
 
从类 java.lang.Object 继承的方法
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

字段详细信息

DEFAULT_PARAM

public static final String DEFAULT_PARAM
'stylesheetLocation' parameter. Points to the xsl.

另请参见:
常量字段值
构造方法详细信息

XSLTResult

public XSLTResult()

XSLTResult

public XSLTResult(String stylesheetLocation)
方法详细信息

setNoCache

public void setNoCache(String val)

setLocation

public void setLocation(String location)
已过时。 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()
已过时。 Since 2.1.1


setMatchingPattern

public void setMatchingPattern(String matchingPattern)
已过时。 Since 2.1.1


getExcludingPattern

public String getExcludingPattern()
已过时。 Since 2.1.1


setExcludingPattern

public void setExcludingPattern(String excludingPattern)
已过时。 Since 2.1.1


getStatus

public String getStatus()

setStatus

public void setStatus(String status)

setParse

public void setParse(boolean parse)
If true, parse the stylesheet location for OGNL expressions.

参数:
parse -

execute

public void execute(com.opensymphony.xwork2.ActionInvocation invocation)
             throws Exception
指定者:
接口 com.opensymphony.xwork2.Result 中的 execute
抛出:
Exception