reisende
05-13-2009, 08:04 PM
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.
Example:
<question order="3" id="125" answertype="Text">
<text>This is question 3.</text>
</question>
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.
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.
Example:
<question order="3" id="125" answertype="Text">
<text>This is question 3.</text>
</question>
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.