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

2019-06-25 06:05发布

问题:

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>


标签: xml xslt