0

现在我有 XSLT 可以按照我想要的方式转换 XML。但它的工作非常缓慢。主要问题在这里:

<xsl:key name="document" match="/coverage/module/method/seqpnt/@document" use="." />
<xsl:key name="classes" match="/coverage/module/method/@class" use="." />
<xsl:template match="/coverage[@profilerVersion='1.5.8 Beta']">

<xsl:variable name="allDocuments" select="module/method/seqpnt/@document[generate-id()
                                   = generate-id(key('document',.)[1])]" />
    <xsl:for-each select="$allDocuments">
                        <xsl:if test="$docUrl = .">

                            <xsl:variable name="docId" select="position()" />


                    ......
                        <xsl:text>&#xa;</xsl:text>
                        </xsl:if>
    </xsl:for-each>

基本上allDocuments变量包含所有文档的列表 - 字符串列表。我想稍后将包含该文档值的输入 XML 中的属性替换为文档 ID - 此列表中的绝对位置。现在我正在遍历每条记录并检查字符串是否等于列表中的字符串,如果是 - 获取位置。有什么方法可以达到更好的性能吗?例如在变量上使用键?

4

1 回答 1

0

您可以尝试这样的事情:
添加一个基于xsl:numberand生成唯一连续 id 的模板key()

<xsl:template match="seqpnt" mode="genId">
    <xsl:number count="/coverage/module/method/seqpnt[generate-id()=generate-id(key('kDocument',@document)[1])]"
        level="any" />
</xsl:template>

具有文档属性的父节点的键:

<xsl:key name="kDocument" match="/coverage/module/method/seqpnt" use="@document" />

比你的模板可以是这样的:

<xsl:template match="/coverage[@profilerVersion='1.5.8 Beta']">
    <!-- docUrl -->
    <xsl:apply-templates select="key('kDocument',$docUrl)[1]" mode="genId" />
    <xsl:text>&#xa;</xsl:text>
</xsl:template>
于 2013-07-17T14:28:36.637 回答