0

这是该问题的示例 XML:

<functions>
  <function id="678">
            <name>getFunctions()</name>
            <File ID="1">
                <ncss>0</ncss>
                <ccn>0</ccn>
                <javadocs>0</javadocs>
            </File>
            <File ID="2">
                <ncss>5</ncss>
                <ccn>3</ccn>
                <javadocs>1</javadocs>
            </File>

           <function>    
        </functions>

我需要输出采用以下格式(表格)

FunctionId  Name            FileID    NCSS  CCN   Javadocs
678         getFunctions()  1         0      0      0
                            2         5      3      1

这样做的问题是,当我用其他文本(例如 sourceFile 和 destFile 而不是 File id="1" 和 File id="2")替换 2 个 File 标记时,我能够获得所需的输出。

但我需要它采用上述格式,我不知道如何去做。所有输入将不胜感激。

谢谢你。

这是我在此之前使用的 XSLT 片段:

<center><h1>Function Summary</h1></center>

<table width="1000" border="1" cellspacing="5">

 <tr>
    <th width="73" align="center" valign="top">ID</th>
    <th width="176" align="center" valign="top">Name></th>
    <th colspan="2" align="center" valign="top">File</th>
    <th colspan="2" align="center" valign="top">NCSS</th>
    <th colspan="2" align="center" valign="top">CCN</th>
    <th colspan="2" align="center" valign="top">Javadocs</th>
  </tr>


  <xsl:for-each select="//function">

  <tr>
    <td align="center" valign="top">  <xsl:value-of select="@id" />  </td>
    <td align="left" valign="middle">  <xsl:value-of select="name" /> </td>

    <td width="40" align="center" valign="top">srcFile</td>

    <td width="50" align="center" valign="top">summaryFile</td>

    <td width="63" align="center" valign="top"> <xsl:value-of select="sourceFile/ncss" /> </td>
    <td width="80" align="center" valign="top"><xsl:value-of select="summaryFile/ncss" /></td>
    <td width="53" align="center" valign="top"><xsl:value-of select="sourceFile/ccn" /></td>
    <td width="66" align="center" valign="top"><xsl:value-of select="summaryFile/ccn" /></td>
    <td width="108" align="center" valign="top"><xsl:value-of select="sourceFile/javadocs" /></td>
    <td width="109" align="center" valign="top"><xsl:value-of select="summaryFile/javadocs" /></td>
  </tr>
</xsl:for-each>
</table>

sourceFile 和 summaryFile 已分别替换为 File id="1" 和 File id="2"。输出将只是一个 HTML 表格。

4

2 回答 2

1

这会以文本格式输出您

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output method="text" indent="yes" encoding="utf-8" />
    <xsl:template match="/">
        <xsl:for-each-group select="functions/function"
            group-by="@id">

            <xsl:variable name="functionId" select="current-grouping-key()" />
            <xsl:variable name="functionName" select="name" />
            <xsl:for-each select="File">
                <xsl:choose>
                    <xsl:when test="position()=1">
                        6 fields ...
                    </xsl:when>
                    <xsl:otherwise>
                        4 fields
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>
于 2013-04-30T18:23:58.217 回答
1

据我了解,您喜欢为属于函数的每个文件生成一个表,其中只有第一个文件具有函数名称和@id。

许多更改是让您的 for-each 运行文件,但仅在当前函数内。Thant 测试当前文件是否是第一个文件 (position() = 1) 并添加名称和@id。

尝试这样的事情:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="functions">
    <center>
        <h1>Function Summary</h1>
    </center>

    <table width="1000" border="1" cellspacing="5">

        <tr>
            <th width="73" align="center" valign="top">ID</th>
            <th width="176" align="center" valign="top">Name</th>
            <th align="center" valign="top">File</th>
            <th  align="center" valign="top">NCSS</th>
            <th  align="center" valign="top">CCN</th>
            <th  align="center" valign="top">Javadocs</th>
        </tr>

        <xsl:apply-templates select="function"/>

    </table>
    </xsl:template>
    <xsl:template match="function">

        <xsl:for-each select="//File">
            <tr>
                <td align="center" valign="top">
                    <xsl:if test="position()=1" >
                        <xsl:value-of select="../@id" />
                    </xsl:if>
                </td>
                <td align="left" valign="middle">
                    <xsl:if test="position()=1" >
                        <xsl:value-of select="../name" />
                    </xsl:if>
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="@ID" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="ncss" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="ccn" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="javadocs" />
                </td>
            </tr>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

这将生成此输出:

<?xml version="1.0"?>
<center xmlns="http://www.w3.org/1999/xhtml">
  <h1>Function Summary</h1>
</center><table xmlns="http://www.w3.org/1999/xhtml" width="1000" border="1" cellspacing="5">
  <tr>
    <th width="73" align="center" valign="top">ID</th>
    <th width="176" align="center" valign="top">Name</th>
    <th align="center" valign="top">File</th>
    <th align="center" valign="top">NCSS</th>
    <th align="center" valign="top">CCN</th>
    <th align="center" valign="top">Javadocs</th>
  </tr>
  <tr>
    <td align="center" valign="top">678</td>
    <td align="left" valign="middle">getFunctions()</td>
    <td align="center" valign="top">1</td>
    <td align="center" valign="top">0</td>
    <td align="center" valign="top">0</td>
    <td align="center" valign="top">0</td>
  </tr>
  <tr>
    <td align="center" valign="top"/>
    <td align="left" valign="middle"/>
    <td align="center" valign="top">2</td>
    <td align="center" valign="top">5</td>
    <td align="center" valign="top">3</td>
    <td align="center" valign="top">1</td>
  </tr>
</table>

更新:要 在表格中显示空单元格,有一些可能的解决方案:

添加&nbsp;tom 空单元格。

<xsl:text disable-output-escaping="yes"><![CDATA[&nbsp;]]></xsl:text>

使用 css 显示空单元格

<style type="text/css">
    table { empty-cells: show; }
</style>

更新使用 rowspan 连接前两列中的行。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://www.w3.org/1999/xhtml">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="functions">
    <center>
        <h1>Function Summary</h1>
    </center>
        <style type="text/css">
            table { empty-cells: show; }
        </style>
    <table  border="1" cellspacing="5">

        <tr>
            <th width="73" align="center" valign="top">ID</th>
            <th width="176" align="center" valign="top">Name</th>
            <th align="center" valign="top">File</th>
            <th  align="center" valign="top">NCSS</th>
            <th  align="center" valign="top">CCN</th>
            <th  align="center" valign="top">Javadocs</th>
        </tr>

        <xsl:apply-templates select="function"/>

    </table>
    </xsl:template>
    <xsl:template match="function">
        <xsl:variable name="file_cnt" select="count(File)" />

        <xsl:for-each select="File">
            <tr>
                <xsl:if test="position()=1" >
                    <td align="center" valign="top" rowspan="{$file_cnt}">
                        <xsl:value-of select="../@id" />
                    </td>
                    <td align="center" valign="top" rowspan="{$file_cnt}">
                        <xsl:value-of select="../name" />
                    </td>
                </xsl:if>
                <td  align="center" valign="top">
                    <xsl:value-of select="@ID" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="ncss" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="ccn" />
                </td>
                <td  align="center" valign="top">
                    <xsl:value-of select="javadocs" />
                </td>
            </tr>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
于 2013-05-01T08:42:34.893 回答