how to use for-each inside another for-each in xsl

匿名 (未验证) 提交于 2019-12-03 01:22:02

问题:

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>&#x0A;</xsl:text>         </xsl:if>     </xsl:for-each> </xsl:template> </xsl:stylesheet> 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!