the xml is
<XYZ>
<manager>
<mId>m1</mId>
<mName>mName1</mName>
<manager>
<manager>
<mId>m2</mId>
<mName>mName2</mName>
<manager>
<department>
<dName>d1</dName>
<dManager>m1</dManager>
<department>
<department>
<dName>d2</dName>
<dManager>m1</dManager>
<department>
<department>
<dName>d3</dName>
<dManager>m2</dManager>
<department>
</XYZ>
for each manager, output all the department name he manages, my code is like
<xsl:for-each select="XYZ/manager">
<xsl:variable name='mId'>
<xsl:value-of select="mId"/>
</xsl:variable>
<p>
manager <xsl:value-of select="mName"/> manages department
<xsl:for-each select="XYZ/department[dManager=$mId]">
<xsl:value-of select="XYZ/department/dName"/>,
</xsl:for-each>
</p>
</xsl:for-each>
and it outputs nothing after the manages department
, anyone know what's wrong? thank you!
You had a context problem inside your for-each
: the for-each
instruction changes the context, then when you apply your second for-each
and/or when you call for the value of department/dName
, you're not in the right context.
Then just fix your two last select as below :
<xsl:for-each select="XYZ/manager">
<xsl:variable name='mId'>
<xsl:value-of select="mId"/>
</xsl:variable>
<p>
manager <xsl:value-of select="mName"/> manages department
<xsl:for-each select="/XYZ/department[dManager=$mId]">
<xsl:value-of select="dName"/>,
</xsl:for-each>
</p>
</xsl:for-each>
This might help you. Have corrected your XPaths with little modification in output format:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="/XYZ/manager">
<xsl:variable name='mId'>
<xsl:value-of select="mId"/>
</xsl:variable>manager <xsl:value-of select="mName"/> manages department <xsl:for-each select="/XYZ/department[dManager=$mId]">
<xsl:value-of select="dName"/>
<xsl:if test="position() != last()">, </xsl:if>
</xsl:for-each>
<xsl:if test="position() != last()">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>