Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSL将具有属性的xml行转换为无序列表树视图_Xml_Xslt_Xslt 1.0_Xslt Grouping_Muenchian Grouping - Fatal编程技术网

XSL将具有属性的xml行转换为无序列表树视图

XSL将具有属性的xml行转换为无序列表树视图,xml,xslt,xslt-1.0,xslt-grouping,muenchian-grouping,Xml,Xslt,Xslt 1.0,Xslt Grouping,Muenchian Grouping,以下XML来自SharePoint控件。我想使用XSLT转换以生成嵌套的ul>li列表。但是当我迭代每一行时,我遇到了问题,主文件夹会对每一行重复,而不是创建一个主文件夹节点并在该节点下添加Menu_Display_name的值来模拟树视图。。。 我的XML类似于: <dsQueryResponse> <NewDataSet> <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP H

以下XML来自SharePoint控件。我想使用XSLT转换以生成嵌套的ul>li列表。但是当我迭代每一行时,我遇到了问题,主文件夹会对每一行重复,而不是创建一个主文件夹节点并在该节点下添加Menu_Display_name的值来模拟树视图。。。 我的XML类似于:

<dsQueryResponse>
    <NewDataSet>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP HR TIME SELF SERVICE" SECONDARY_FOLDER="Time" MENU_DISPLAY_NAME="Create Timecard"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP HR TIME SELF SERVICE" SECONDARY_FOLDER="Time" MENU_DISPLAY_NAME="Recent Timecards"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP HR TIME SELF SERVICE" SECONDARY_FOLDER="Time" MENU_DISPLAY_NAME="Templates"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP HR TIME SELF SERVICE" SECONDARY_FOLDER="Time" MENU_DISPLAY_NAME="Timecard Search"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ CORP EXP ENTRY" SECONDARY_FOLDER="" MENU_DISPLAY_NAME="Expenses Home"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ HR EMP SELF SERVICE" SECONDARY_FOLDER="" MENU_DISPLAY_NAME="Accommodation Request"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ HR EMP SELF SERVICE" SECONDARY_FOLDER="" MENU_DISPLAY_NAME="Additional Personal Information" ></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ HR EMP SELF SERVICE" SECONDARY_FOLDER="" MENU_DISPLAY_NAME="All Actions Awaiting Your Attention"></Row>
        <Row DOMAIN_USERNAME="someUser" PRIMARY_FOLDER="XYZ HR EMP SELF SERVICE" SECONDARY_FOLDER="" MENU_DISPLAY_NAME="Appraisals"></Row>
    </NewDataSet>
</dsQueryResponse>

我对XSL的“穷人尝试”是这样的:

 <xsl:template name="dvt_1.body">
    <xsl:param name="Rows" />
    <xsl:param name="FirstRow" />
    <xsl:param name="LastRow" />
    <ul>
      <xsl:for-each select="$Rows">
        <xsl:if test="position() &gt;= $FirstRow and position() &lt;= $LastRow">
          <xsl:call-template name="dvt_1.rowview" />
        </xsl:if>
      </xsl:for-each>
    </ul>
  </xsl:template>


  <xsl:template name="dvt_1.rowview">

    <li class="isFolder isExpanded">
       <xsl:value-of select="@PRIMARY_FOLDER" />
       <xsl:choose>
         <xsl:when test="@SECONDARY_FOLDER != ''">
           <ul>
             <li class="isFolder isExpanded">
               <xsl:value-of select="@SECONDARY_FOLDER" />
               <ul>
                  <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
               </ul>
             </li>
           </ul>
         </xsl:when>
         <xsl:otherwise>
           <ul>
              <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
           </ul>
          </xsl:otherwise>
        </xsl:choose>
    </li>

  </xsl:template>
<div id="navigator">
        <ul>
            <li class="isFolder isExpanded">
               XYZ CORP HR TIME SELF SERVICE    
                <ul>
                    <li class="isFolder isExpanded">
                        Time
                            <ul>
                                <li><a href="#" target="_tab">Create Timecard</a></li>
                                <li><a href="#" target="_tab">Recent Timecards</a></li>
                                <li><a href="#" target="_tab">Templates</a></li>
                                <li><a href="#" target="_tab">Timecard Search</a></li>                                   
                            </ul>
                    </li>
                </ul>        
            </li>
            <li class="isFolder isExpanded">
                XYZ CORP EXP ENTRY
                <ul>
                    <li><a href="#" target="_tab">Expense Home</a></li>      
                </ul>
            </li> 
            <li class="isFolder isExpanded">
                XYZ HR EMP SELF SERVICE
                <ul>
                    <li><a href="#" target="_tab">Accommodation Request</a></li>
                    <li><a href="#" target="_tab">Additional Personal Information</a></li>
                    <li><a href="#" target="_tab">All Actions Awaiting Your Attention</a></li>
                    <li><a href="#" target="_tab">Appraisals</a></li>
                </ul>
            </li>
        </ul>
    </div>
<xsl:key name="primary" match="Row" use="@PRIMARY_FOLDER" />

  • 我想要的xsl输出如下:

     <xsl:template name="dvt_1.body">
        <xsl:param name="Rows" />
        <xsl:param name="FirstRow" />
        <xsl:param name="LastRow" />
        <ul>
          <xsl:for-each select="$Rows">
            <xsl:if test="position() &gt;= $FirstRow and position() &lt;= $LastRow">
              <xsl:call-template name="dvt_1.rowview" />
            </xsl:if>
          </xsl:for-each>
        </ul>
      </xsl:template>
    
    
      <xsl:template name="dvt_1.rowview">
    
        <li class="isFolder isExpanded">
           <xsl:value-of select="@PRIMARY_FOLDER" />
           <xsl:choose>
             <xsl:when test="@SECONDARY_FOLDER != ''">
               <ul>
                 <li class="isFolder isExpanded">
                   <xsl:value-of select="@SECONDARY_FOLDER" />
                   <ul>
                      <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
                   </ul>
                 </li>
               </ul>
             </xsl:when>
             <xsl:otherwise>
               <ul>
                  <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
               </ul>
              </xsl:otherwise>
            </xsl:choose>
        </li>
    
      </xsl:template>
    
    <div id="navigator">
            <ul>
                <li class="isFolder isExpanded">
                   XYZ CORP HR TIME SELF SERVICE    
                    <ul>
                        <li class="isFolder isExpanded">
                            Time
                                <ul>
                                    <li><a href="#" target="_tab">Create Timecard</a></li>
                                    <li><a href="#" target="_tab">Recent Timecards</a></li>
                                    <li><a href="#" target="_tab">Templates</a></li>
                                    <li><a href="#" target="_tab">Timecard Search</a></li>                                   
                                </ul>
                        </li>
                    </ul>        
                </li>
                <li class="isFolder isExpanded">
                    XYZ CORP EXP ENTRY
                    <ul>
                        <li><a href="#" target="_tab">Expense Home</a></li>      
                    </ul>
                </li> 
                <li class="isFolder isExpanded">
                    XYZ HR EMP SELF SERVICE
                    <ul>
                        <li><a href="#" target="_tab">Accommodation Request</a></li>
                        <li><a href="#" target="_tab">Additional Personal Information</a></li>
                        <li><a href="#" target="_tab">All Actions Awaiting Your Attention</a></li>
                        <li><a href="#" target="_tab">Appraisals</a></li>
                    </ul>
                </li>
            </ul>
        </div>
    
    <xsl:key name="primary" match="Row" use="@PRIMARY_FOLDER" />
    
    
    
    • XYZ公司人力资源时间自助服务
      • 时间
    • XYZ公司出口报关单
    • XYZ HR EMP自助服务
    有人能帮助我使用xslt实现这一点吗?

    确实是xslt 1.0中需要了解的内容(我相信Sharepoint就是这么使用的)。首先,通过
    PRIMARY\u VALUE
    属性进行分组,这样就有了如下键:

     <xsl:template name="dvt_1.body">
        <xsl:param name="Rows" />
        <xsl:param name="FirstRow" />
        <xsl:param name="LastRow" />
        <ul>
          <xsl:for-each select="$Rows">
            <xsl:if test="position() &gt;= $FirstRow and position() &lt;= $LastRow">
              <xsl:call-template name="dvt_1.rowview" />
            </xsl:if>
          </xsl:for-each>
        </ul>
      </xsl:template>
    
    
      <xsl:template name="dvt_1.rowview">
    
        <li class="isFolder isExpanded">
           <xsl:value-of select="@PRIMARY_FOLDER" />
           <xsl:choose>
             <xsl:when test="@SECONDARY_FOLDER != ''">
               <ul>
                 <li class="isFolder isExpanded">
                   <xsl:value-of select="@SECONDARY_FOLDER" />
                   <ul>
                      <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
                   </ul>
                 </li>
               </ul>
             </xsl:when>
             <xsl:otherwise>
               <ul>
                  <li><xsl:value-of select="@MENU_DISPLAY_NAME" /></li>
               </ul>
              </xsl:otherwise>
            </xsl:choose>
        </li>
    
      </xsl:template>
    
    <div id="navigator">
            <ul>
                <li class="isFolder isExpanded">
                   XYZ CORP HR TIME SELF SERVICE    
                    <ul>
                        <li class="isFolder isExpanded">
                            Time
                                <ul>
                                    <li><a href="#" target="_tab">Create Timecard</a></li>
                                    <li><a href="#" target="_tab">Recent Timecards</a></li>
                                    <li><a href="#" target="_tab">Templates</a></li>
                                    <li><a href="#" target="_tab">Timecard Search</a></li>                                   
                                </ul>
                        </li>
                    </ul>        
                </li>
                <li class="isFolder isExpanded">
                    XYZ CORP EXP ENTRY
                    <ul>
                        <li><a href="#" target="_tab">Expense Home</a></li>      
                    </ul>
                </li> 
                <li class="isFolder isExpanded">
                    XYZ HR EMP SELF SERVICE
                    <ul>
                        <li><a href="#" target="_tab">Accommodation Request</a></li>
                        <li><a href="#" target="_tab">Additional Personal Information</a></li>
                        <li><a href="#" target="_tab">All Actions Awaiting Your Attention</a></li>
                        <li><a href="#" target="_tab">Appraisals</a></li>
                    </ul>
                </li>
            </ul>
        </div>
    
    <xsl:key name="primary" match="Row" use="@PRIMARY_FOLDER" />
    
    首先,选择每个
    PRIMARY\u文件夹第一次出现的行

    <xsl:for-each select="$rows[generate-id() = generate-id(key('primary', @PRIMARY_FOLDER)[1])]">
    
    唯一的额外工作是,根据是否填充了
    SECONDARY\u文件夹
    ,您的行为略有不同。不过,您可以使用两个单独的模板来实现这一点

    尝试以下XSLT:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="html" indent="yes" />
    
        <xsl:key name="primary" match="Row" use="@PRIMARY_FOLDER" />
        <xsl:key name="secondary" match="Row" use="concat(@PRIMARY_FOLDER, '|', @SECONDARY_FOLDER)" />
    
        <xsl:variable name="rows" select="//Row" />
    
        <xsl:template match="/">
          <ul>
              <xsl:for-each select="$rows[generate-id() = generate-id(key('primary', @PRIMARY_FOLDER)[1])]">
                  <li class="isFolder isExpanded">
                      <xsl:value-of select="@PRIMARY_FOLDER" />
                      <xsl:apply-templates select="key('primary', @PRIMARY_FOLDER)[generate-id() = generate-id(key('secondary', concat(@PRIMARY_FOLDER, '|', @SECONDARY_FOLDER))[1])]" mode="secondary" />
                  </li>
              </xsl:for-each>
          </ul>
        </xsl:template>
    
        <xsl:template match="Row[@SECONDARY_FOLDER != '']" mode="secondary">
            <li class="isFolder isExpanded">
                <xsl:value-of select="@SECONDARY_FOLDER" />
                <ul>
                    <xsl:apply-templates select="key('secondary', concat(@PRIMARY_FOLDER, '|', @SECONDARY_FOLDER))" />
                </ul>
            </li>
        </xsl:template>
    
        <xsl:template match="Row" mode="secondary">
            <xsl:apply-templates select="key('primary', @PRIMARY_FOLDER)" />
        </xsl:template>
    
        <xsl:template match="Row">
            <li>
                <a href="#" target="_tab">
                    <xsl:value-of select="@MENU_DISPLAY_NAME" />
                </a>
            </li>
        </xsl:template>
    </xsl:stylesheet>
    
    
    
  • 请在中查看此操作


    注意,如果您的实际XML具有名称空间,则需要修改XSLT以将其考虑在内。

    您可以向我们展示您的XSLT代码吗?@JEY-Sure已更新。Muenchian分组是我应该看到的吗?有人能帮我吗?确实这是你最好的机会,或者如果您使用xslt2,您可以为每个groupSharePoint使用.NET集成XSLT实现,因此它仅限于XSLT1.0。