So, I am in a bind and need to figure out how I can match a
form item in xsl that contains a certain attribute – and output my own
formatted tag without duplicating the form tag. I need to recognize our special
forms and have a huge template to match depending on if there is a certain
attribute (rn:webform). If it is a normal form I want it to match the
catchall template <xsl:template
match="node()|@*"> and output it exactly as it appears in the original
xml. An extremely stripped down example follows: Here is the incoming xml that needs to be transformed. ----------------------------------------------------------- <?xml version="1.0" encoding="UTF-8"?> <document> <html xmlns:xsl="http://www.w3.org/1999/xhtml"
xmlns:rn="http://schemas.rightnow.com/crm/document"> <head><title>Page
1</title></head> <body><form rn:webform="true"> <rn:question
question_id="2"
split="False">#2</rn:question><p><input
id="submit_btn" type="submit" value="Submit"
name="submit_btn"
rn:submit="true"/></p></form></body> </html> </document> ----------------------------------------------------------- Here is a sample xsl file which will illustrate the problem <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rn="http://schemas.rightnow.com/crm/document" version="1.0"> <xsl:output encoding="UTF-8"
method="html"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"
/> </xsl:copy> </xsl:template> <xsl:template match="form/@rn:webform"> <form
action="" name="_main"> <input type="hidden"
name="In_form_template" /> <xsl:apply-templates /> </form> </xsl:template> <xsl:template match="rn:question|rn:answer"> <input type="hidden" AARON="in
question and answer"/> </xsl:template> </xsl:stylesheet> ----------------------------------------------------------- The output I am getting (this can be reproduced with xsltproc) is: ----------------------------------------------------------- <document><html> <head><title>Page 1</title></head> <body><form> <form action=""
name="_mainer"> <input type="hidden" name="In_form_template">true</form> <input type="hidden" AARON="in question and
answer"><p><input id="submit_btn"
type="submit" value="Submit" name="submit_btn"
submit="true"></p> </form></body> </html></document> ----------------------------------------------------------- As you can see I am getting two opening and closing form tags.
What I want is the <form action….. and then the eventual closing form
tag as everything needs to be encapsulated with this. I tried modifying
the <xsl:template match="node()|@*"> to the following (which
would be a bad solution anyways but I figured I would try): ----------------------------------------------------------- <xsl:template match="node()|@*"> <xsl:choose> <xsl:when test="@rn:webform =
'true'"> <xsl:apply-templates
select="node()|@*" /> </xsl:when> <xsl:otherwise> <xsl:copy>
<xsl:apply-templates select="node()|@*" /> </xsl:copy> </xsl:otherwise> </xsl:choose> </xsl:template> ----------------------------------------------------------- This allowed me to get rid of the duplication and the opening form tag
is correct. However, I need the closing form tag at the end. As can also
be seen, the input tag that was in the rn:question template is only appearing after
the closing form tag even though I have the <xsl:apply-templates />
before it. See below: HELP ----------------------------------------------------------- <document><html> <head><title>Page 1</title></head> <body> <form action="" name="_mainer"> <input type="hidden"
name="In_form_template">true</form> <input type="hidden" AARON="in question and
answer"><p><input id="submit_btn"
type="submit" value="Submit" name="submit_btn"
submit="true"></p> </body> </html></document> |