代码之家  ›  专栏  ›  技术社区  ›  Nathan DeWitt

如何获取XML文档的所有子节点?

  •  1
  • Nathan DeWitt  · 技术社区  · 14 年前

    我有一个XML文档,它为这一任务层次结构建模:

    1     Customer
    1.1   Product A
    1.1.1 Task Alpha
    1.1.2 Task Beta
    1.2   Product B
    1.2.1 Task Alpha
    1.2.2 Task Gamma
    2     Customer
    2.1   Product W
    2.1.1 Task Delta
    

    未知数量的客户、产品和每个产品的任务。也可能有未知数量的子任务,因此我们可以看到:

    19.16.8.17.1 Subtask Something
    

    XML如下所示:

    <ROWSET>
        <ROW>
            <PROJECT_CODE>Don't Care</PROJECT_CODE>
        </ROW>
        <ROW>
            <PROJECT_CODE>WBS</PROJECT_CODE>
            <TASK_DETAIL>
                <TASKS>
                    <TASK>
                        <TASK_CODE>1</TASK_CODE>
                        <TASK_DESCRIPTION>Customer 1</TASK_DESCRIPTION>
                        <TASKS>
                            <TASK>
                                <TASK_CODE>1.1</TASK_CODE>
                                <TASK_DESCRIPTION>Product A</TASK_DESCRIPTION>
                                <TASKS>
                                    <TASK_CODE>1.1.1</TASK_CODE>
                                    <TASK_DESCRIPTION>Task Alpha</TASK_DESCRIPTION>
                                    <TASKS />
                                    <TASK_CODE>1.1.2</TASK_CODE>
                                    <TASK_DESCRIPTION>Task Beta</TASK_DESCRIPTION>
                                    <TASKS />
                                </TASKS>
                            </TASK>
                            <TASK>
                                <TASK_CODE>1.2</TASK_CODE>
                                <TASK_DESCRIPTION>Product B</TASK_DESCRIPTION>
                                <TASKS>
                                    <TASK_CODE>1.2.1</TASK_CODE>
                                    <TASK_DESCRIPTION>Task Alpha</TASK_DESCRIPTION>
                                    <TASKS />
                                    <TASK_CODE>1.2.2</TASK_CODE>
                                    <TASK_DESCRIPTION>Task Gamma</TASK_DESCRIPTION>
                                    <TASKS />
                                </TASKS>
                            </TASK>
                        </TASKS>
                    </TASK>
                    <TASK>
                        <TASK_CODE>2</TASK_CODE>
                        <TASK_DESCRIPTION>Customer 2</TASK_DESCRIPTION>
                        <TASKS>
                            <TASK>
                                <TASK_CODE>2.1</TASK_CODE>
                                <TASK_DESCRIPTION>Product W</TASK_DESCRIPTION>
                                <TASKS>
                                    <TASK_CODE>2.1.1</TASK_CODE>
                                    <TASK_DESCRIPTION>Task Delta</TASK_DESCRIPTION>
                                    <TASKS />
                                </TASKS>
                            </TASK>
                        </TASKS>
                    </TASK>
                </TASKS>
            </TASK_DETAIL>
        </ROW>
    </ROWSET>
    

    <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="ROW">
        <xsl:apply-templates select="PROJECT_CODE[.='WBS']"/>
    </xsl:template>
    <xsl:template match="PROJECT_CODE">
        <h1><xsl:value-of select="."/></h1>
        <table>
            <tr>
                <th>Task Code</th>
                <th>Description</th>
            </tr>
            <xsl:for-each select="./../TASK_DETAIL/TASKS/TASK">
            <tr>
                <td><xsl:value-of select="TASK_CODE"/></td>
                <td><xsl:value-of select="TASK_DESCRIPTION"/></td>
            </tr>
                <xsl:for-each select="./TASKS/TASK">
                    <tr>
                        <td><xsl:value-of select="TASK_CODE"/></td>
                        <td><xsl:value-of select="TASK_DESCRIPTION"/></td>
                    </tr>
                </xsl:for-each>
            </xsl:for-each>
        </table>
    </xsl:template>
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   David roman-mkh    14 年前

    看起来musikk比我解释得更清楚了,但是这里有一个演示xslt,它实现了我理解的您想要的功能。一般来说,避免xsl:for-each for 大多数你认为你应该为每个for使用的东西(例如,在其他语言中你会为每个for使用的东西)。相反,如musikk所说,使用apply templates或call templates。如果您必须多次处理同一内容(例如,生成目录,然后生成正文,然后生成索引),请阅读modes(mode=“foo”)。

        <?xml version="1.0" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <html>
          <body>
            <xsl:apply-templates/>
          </body>
        </html>
      </xsl:template>
      <xsl:template match="ROW[./PROJECT_CODE='WBS']">
        <h1><xsl:value-of select="PROJECT_CODE"/></h1>
        <table>
          <tr>
            <th>Task Code</th>
            <th>Description</th>
          </tr>
          <xsl:apply-templates/>
        </table>
      </xsl:template>
      <xsl:template match="TASK">
        <tr>
          <td><xsl:value-of select="TASK_CODE"/></td>
          <td><xsl:value-of select="TASK_DESCRIPTION"/></td>
        </tr>
        <xsl:apply-templates/>
      </xsl:template>
      <xsl:template match="text()"/>
    </xsl:stylesheet>
    

    这将产生:

        <html>
       <body>
          <h1>WBS</h1>
          <table>
             <tr>
                <th>Task Code</th>
                <th>Description</th>
             </tr>
             <tr>
                <td>1</td>
                <td>Customer 1</td>
             </tr>
             <tr>
                <td>1.1</td>
                <td>Product A</td>
             </tr>
             <tr>
                <td>1.2</td>
                <td>Product B</td>
             </tr>
             <tr>
                <td>2</td>
                <td>Customer 2</td>
             </tr>
             <tr>
                <td>2.1</td>
                <td>Product W</td>
             </tr>
          </table>
       </body>
    </html>
    
        2
  •  3
  •   musiKk    14 年前

    xsl:for-each 直接声明几个模板就可以了 xsl:template 并通过

    1. xsl:call-template
    2. xsl:apply-templates

    基本用途 应该足够了,但有时你想匹配一个特定的规则。

    w3schools ):

    1. 一个模板 tasks 一个给我 task
    2. 的模板 任务 走过街道 节点并调用 任务 每个的模板 任务
    3. 这个 任务 模板本身调用 任务 任务 节点