可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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!
回答1:
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>
回答2:
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>