add some of the fields of an XML together with XSLT (but not all) -
i great noob xslt concerned. copied , pasted stuff forum, , works. however, finetune. can find examples of how concat fields, nog how concat of fields.
i have xml
<xs:element name="medewerker_x"> <xs:complextype> <xs:sequence> <xs:element name="medewerker" type="xs:string" minoccurs="0" /> <xs:element name="roepnaam" type="xs:string" minoccurs="0" /> <xs:element name="voorletters" type="xs:string" minoccurs="0" /> <xs:element name="voorvoegsel" type="xs:string" minoccurs="0" /> <xs:element name="achternaam" type="xs:string" minoccurs="0" /> <xs:element name="e-mail_werk" type="xs:string" minoccurs="0" /> </xs:sequence> </xs:complextype> </xs:element> <medewerker_x> <medewerker>654654</medewerker> <roepnaam>mark</roepnaam> <voorletters>mab</voorletters> <achternaam>puist</achternaam> <email>lala@test.com</email> </medewerker_x> <medewerker_x> <medewerker>084680</medewerker> <roepnaam>maarten</roepnaam> <voorletters>m</voorletters> <voorvoegsel>ter</voorvoegsel> <achternaam>doornemalen</achternaam> <email>sweetie@test.com</email> </medewerker_x>
with xslt
<xsl:strip-space elements="*" /> <xsl:template match="/*/child::*"> <xsl:for-each select="child::*"> <xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>;</xsl:if> <xsl:if test="position() = last()"><xsl:value-of select="normalize-space(.)"/> <xsl:text>
</xsl:text> </xsl:if> </xsl:for-each> </xsl:template>
it outputs this:
654654;mark;mab;puist;lala@test.com 084680;maarten;m;ter;doornemalen;sweetie@test.com
what have output this, of fields concatenated (and others no relevant):
mark puist;lala@test.com maarten ter doornemalen;sweetie@test.com
order of fields not relevant, additional fields can there, don't mind. long 2 columns present.
can me?
edited
i think input xml (note have added root node named <root>
)
<root> <medewerker_x> <medewerker>654654</medewerker> <roepnaam>mark</roepnaam> <voorletters>mab</voorletters> <achternaam>puist</achternaam> <email>lala@test.com</email> </medewerker_x> <medewerker_x> <medewerker>084680</medewerker> <roepnaam>maarten</roepnaam> <voorletters>m</voorletters> <voorvoegsel>ter</voorvoegsel> <achternaam>doornemalen</achternaam> <email>sweetie@test.com</email> </medewerker_x> </root>
with xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:output method="text"/> <xsl:template match="/"> <!-- now, we'll loop each child `medewerker_x` of root node --> <xsl:for-each select="root/medewerker_x"> <!-- if position greater 1, add linebreak before --> <xsl:if test="position() > 1"> <xsl:text>
</xsl:text> </xsl:if> <!-- let loop of target child elements --> <xsl:for-each select="*[self::roepnaam or self::voorvoegsel or self::achternaam or self::email]"> <xsl:choose> <!-- test position of elements. in input xml, `email` last child element --> <xsl:when test="position() = last()"> <xsl:text>;</xsl:text> <xsl:value-of select="."/> </xsl:when> <!-- tests 2nd last position --> <xsl:when test="position() = last()-1"> <xsl:value-of select="."/> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:for-each> </xsl:template> </xsl:stylesheet>
it outputs:
mark puist;lala@test.com maarten ter doornemalen;sweetie@test.com
Comments
Post a Comment