001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 /* 019 * $Id: KeyDeclaration.java 468643 2006-10-28 06:56:03Z minchau $ 020 */ 021 package org.apache.xalan.templates; 022 023 import org.apache.xml.utils.QName; 024 import org.apache.xpath.XPath; 025 026 /** 027 * Holds the attribute declarations for the xsl:keys element. 028 * A stylesheet declares a set of keys for each document using 029 * the xsl:key element. When this set of keys contains a member 030 * with node x, name y and value z, we say that node x has a key 031 * with name y and value z. 032 * @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a> 033 * @xsl.usage internal 034 */ 035 public class KeyDeclaration extends ElemTemplateElement 036 { 037 static final long serialVersionUID = 7724030248631137918L; 038 039 /** 040 * Constructs a new element representing the xsl:key. The parameters 041 * are needed to prioritize this key element as part of the recomposing 042 * process. For this element, they are not automatically created 043 * because the element is never added on to the stylesheet parent. 044 */ 045 public KeyDeclaration(Stylesheet parentNode, int docOrderNumber) 046 { 047 m_parentNode = parentNode; 048 setUid(docOrderNumber); 049 } 050 051 /** 052 * The "name" property. 053 * @serial 054 */ 055 private QName m_name; 056 057 /** 058 * Set the "name" attribute. 059 * The name attribute specifies the name of the key. The value 060 * of the name attribute is a QName, which is expanded as 061 * described in [2.4 Qualified Names]. 062 * 063 * @param name Value to set for the "name" attribute. 064 */ 065 public void setName(QName name) 066 { 067 m_name = name; 068 } 069 070 /** 071 * Get the "name" attribute. 072 * The name attribute specifies the name of the key. The value 073 * of the name attribute is a QName, which is expanded as 074 * described in [2.4 Qualified Names]. 075 * 076 * @return Value of the "name" attribute. 077 */ 078 public QName getName() 079 { 080 return m_name; 081 } 082 083 /** 084 * Return the node name. 085 * 086 * @return the element's name 087 */ 088 public String getNodeName() 089 { 090 return Constants.ELEMNAME_KEY_STRING; 091 } 092 093 094 /** 095 * The "match" attribute. 096 * @serial 097 */ 098 private XPath m_matchPattern = null; 099 100 /** 101 * Set the "match" attribute. 102 * The match attribute is a Pattern; an xsl:key element gives 103 * information about the keys of any node that matches the 104 * pattern specified in the match attribute. 105 * @see <a href="http://www.w3.org/TR/xslt#patterns">patterns in XSLT Specification</a> 106 * 107 * @param v Value to set for the "match" attribute. 108 */ 109 public void setMatch(XPath v) 110 { 111 m_matchPattern = v; 112 } 113 114 /** 115 * Get the "match" attribute. 116 * The match attribute is a Pattern; an xsl:key element gives 117 * information about the keys of any node that matches the 118 * pattern specified in the match attribute. 119 * @see <a href="http://www.w3.org/TR/xslt#patterns">patterns in XSLT Specification</a> 120 * 121 * @return Value of the "match" attribute. 122 */ 123 public XPath getMatch() 124 { 125 return m_matchPattern; 126 } 127 128 /** 129 * The "use" attribute. 130 * @serial 131 */ 132 private XPath m_use; 133 134 /** 135 * Set the "use" attribute. 136 * The use attribute is an expression specifying the values 137 * of the key; the expression is evaluated once for each node 138 * that matches the pattern. 139 * 140 * @param v Value to set for the "use" attribute. 141 */ 142 public void setUse(XPath v) 143 { 144 m_use = v; 145 } 146 147 /** 148 * Get the "use" attribute. 149 * The use attribute is an expression specifying the values 150 * of the key; the expression is evaluated once for each node 151 * that matches the pattern. 152 * 153 * @return Value of the "use" attribute. 154 */ 155 public XPath getUse() 156 { 157 return m_use; 158 } 159 160 /** 161 * Get an int constant identifying the type of element. 162 * @see org.apache.xalan.templates.Constants 163 * 164 * @return The token ID for this element 165 */ 166 public int getXSLToken() 167 { 168 return Constants.ELEMNAME_KEY; 169 } 170 171 /** 172 * This function is called after everything else has been 173 * recomposed, and allows the template to set remaining 174 * values that may be based on some other property that 175 * depends on recomposition. 176 */ 177 public void compose(StylesheetRoot sroot) 178 throws javax.xml.transform.TransformerException 179 { 180 super.compose(sroot); 181 java.util.Vector vnames = sroot.getComposeState().getVariableNames(); 182 if(null != m_matchPattern) 183 m_matchPattern.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize()); 184 if(null != m_use) 185 m_use.fixupVariables(vnames, sroot.getComposeState().getGlobalsSize()); 186 } 187 188 /** 189 * This function is called during recomposition to 190 * control how this element is composed. 191 * @param root The root stylesheet for this transformation. 192 */ 193 public void recompose(StylesheetRoot root) 194 { 195 root.recomposeKeys(this); 196 } 197 198 }