Hi everyone,

I've been combing the message boards for the last few days trying to find something that will work for me, but to no success. I had 0 experience with XSLT before this which definitely doesn't help out in the search but I am determined to learn.

What I've got is some XML:

<?xml version="1.0" encoding="utf-8" ?>
<newapplicantreturn>
	<applicant id="1234567">
		<questions>
			<question order="1" id="123" answertype="YesNo">
				This is question 1. 
			</question>
			<question order="2" id="124" answertype="YesNo">
				This is question 2.
			</question>
			<question order="3" id="125" answertype="Text">
				This is question 3.
			</question>
		</questions>
	</applicant>
</newapplicantreturn>

What I need to do is take the text in the question element and either add it as an attribute of the question or wrap it in a separate <text></text> child element. I'd prefer the second method but at this point, whatever works.

I found the following XSLT which works great if the text is already in an element:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()" />
  </xsl:copy>
</xsl:template>

<xsl:template match="question">
	<xsl:copy>
		<xsl:apply-templates select="@*" />
		<xsl:apply-templates select="*" mode="element-to-attribute"/>
	</xsl:copy>
</xsl:template>

<xsl:template match="question/*" mode="element-to-attribute">
	<xsl:attribute name="text">
		<xsl:value-of select="." />
	</xsl:attribute>
</xsl:template>

</xsl:stylesheet>

I don't know if the above is easily tweakable to get what I want. I've been researching and trying so many different things I've pretty much hit the wall.

Any help will be greatly appreciated.

Thanks.

Recommended Answers

All 3 Replies

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output indent="yes" method="xml"/>
	<xsl:template match="newapplicantreturn">
		<xsl:variable name="wert1" select="local-name()"/>
		<xsl:element name="{$wert1}">
			<xsl:apply-templates select="applicant"/>
		</xsl:element>
	</xsl:template>
	<xsl:template match="applicant">
		<xsl:copy-of select="@*"/>
		<xsl:apply-templates select="questions"/>
	</xsl:template>
	<xsl:template match="questions">
		<questions>
			<xsl:apply-templates select="question"/>
		</questions>
	</xsl:template>
	<xsl:template match="question">
		<question>
			<xsl:attribute name="order">
				<xsl:value-of select="@order"/>
			</xsl:attribute>
			<xsl:attribute name="id">
				<xsl:value-of select="@id"/>
			</xsl:attribute>
			<xsl:attribute name="answertype">
				<xsl:value-of select="@answertype"/>
			</xsl:attribute>
			<!-- node value to attribut -->
			<xsl:attribute name="text">
				<xsl:value-of select="."/>
			</xsl:attribute>
			<!-- node value to child element -->
			<text><xsl:value-of select="."/></text>
		</question>
	</xsl:template>
</xsl:stylesheet>

Helmut Hagemann

Looks promising, Helmut. Thanks for the reply. I'll give that a try and reply back with results.

Thanks again, Helmut! That was just what I was looking for.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.