0

如果有人能发现任何改进/建议,我希望稍微优化一下这个 XSLT?

我收到一个遵循这种格式的 XML 文件:

<TransfersToComplete>
    <TransfersForFees>
        <Transfer>
            <PlayerID>1234</PlayerID>
            <ClubJoiningID>4444</ClubJoiningID>
            <FeeInPounds>1200000</FeeInPounds>
        </Transfer>
        <Transfer>
            <PlayerID>3835</PlayerID>
            <ClubJoiningID>4444</ClubJoiningID>
            <FeeInPounds>5000000</FeeInPounds>
        </Transfer>
        <Transfer>
            <PlayerID>17118</PlayerID>
            <ClubJoiningID>5229</ClubJoiningID>
            <FeeInPounds>18000000</FeeInPounds>
        </Transfer>
    </TransfersForFees>
    <FreeAgencyTransfers>
        <FreeTransfer>
            <PlayerID>42323</PlayerID>
            <ClubJoiningID>332</ClubJoiningID>
        </FreeTransfer>
    </FreeAgencyTransfers>
</TransfersToComplete>

我还有另一个 XML 文件,其中包含“活动”俱乐部的列表(即由球员而不是 AI 控制的俱乐部)

    <ActiveClubs>
<Club><ClubID>1234</ClubID></Club>
    <Club><ClubID>4482</ClubID></Club>
    </ActiveClubs>

作为 Biztalk 解决方案的一部分,我已将它们加入到双输入映射中,因此输入文档看起来像这样:

<Root>
    <InputMessage0>
        <ActiveClubs>
            <Club>
                <ClubID>1234</ClubID>
            </Club>
            <Club>
                <ClubID>4482</ClubID>
            </Club>
        </ActiveClubs>
    </InputMessage0>
    <InputMessage1>
        <TransfersToComplete>
            <TransfersForFees>
                <Transfer>
                    <PlayerID>1234</PlayerID>
                    <ClubJoiningID>4444</ClubJoiningID>
                    <FeeInPounds>1200000</FeeInPounds>
                </Transfer>
                <Transfer>
                    <PlayerID>3835</PlayerID>
                    <ClubJoiningID>4444</ClubJoiningID>
                    <FeeInPounds>5000000</FeeInPounds>
                </Transfer>
                <Transfer>
                    <PlayerID>17118</PlayerID>
                    <ClubJoiningID>5229</ClubJoiningID>
                    <FeeInPounds>18000000</FeeInPounds>
                </Transfer>
            </TransfersForFees>
            <FreeAgencyTransfers>
                <FreeTransfer>
                    <PlayerID>42323</PlayerID>
                    <ClubJoiningID>332</ClubJoiningID>
                </FreeTransfer>
            </FreeAgencyTransfers>
        </TransfersToComplete>
    </InputMessage1>
</Root>

我不希望游戏中的每个玩家都能看到每次转会的完整运作,所以我只限制在他们自己的俱乐部,我的 XSLT 如下:

    <xsl:for-each select="/*[1]/ActiveClubs/Club">
<xsl:variable name ="clubId" select="current()/ClubID/text()"/>
<...CallTemplate...>
</xsl:for-each>

有没有办法可以优化每个,它有什么帮助?随着活跃俱乐部数量的增加,我看到我的 CPU 慢慢被占用,所以我认为这是部分原因?

编辑:

预期输出将是变量 ClubId 第一次是 1234,第二次是 4482

在我上面的例子(2个活跃的俱乐部)中,我看到很少/没有性能下降——当我达到 40 岁及以上时......

就显示 XSLT 的其余部分而言 - 这是它调用的模板:

<xsl:call-template name="DoPaidTransfers">
  <xsl:with-param name="var:ClubId" select="$clubId"/>
</xsl:call-template>

这是:

  <xsl:template name="DoPaidTransfers">
<xsl:param name="var:ClubId"/>
<responseCode><xsl:value-of select="CSharpCodeCall:DoPaidTransfers($clubId)"/></responseCode>
</xsl:template>

我的 C# 代码将它们写入数据库,返回成功代码,并通过环境传递到其他地方。正如我所说,它按预期工作,但是当增加活跃的俱乐部数量时,我发现性能会显着下降。

4

1 回答 1

0

你能张贴整个xslt吗?

我很确定性能问题不在您展示的 xslt 中。

我通过 VS 中的 ms xsl 处理器在 2000 个活动俱乐部的列表上运行了以下 xslt,同时通过Thread.Sleep()在 C# 脚本中引入 10 毫秒延迟来模拟您的数据库写入调用,结果是:

样式表加载时间:25.12 毫秒样式表执行时间:20125 毫秒

即如果您排除睡眠,则在 125 毫秒内 2000 个俱乐部。

所以问题肯定在其他地方,例如数据是如何TransfersToComplete进入地图的?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:CSharpCodeCall="http://schemas.microsoft.com/BizTalk/2003/userCSharp"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:var="YourNSForVariables"
                exclude-result-prefixes="var msxsl CSharpCodeCall"
                >
    <xsl:template match="/">
        <xsl:for-each select="//*[1]/ActiveClubs/Club">
            <xsl:variable name ="clubId" select="current()/ClubID/text()"/>
            <club>
                <clubid>
                    <xsl:value-of select="$clubId"/>
                </clubid>
                <xsl:call-template name="DoPaidTransfers">
                    <xsl:with-param name="var:ClubId" select="$clubId"/>
                </xsl:call-template>
            </club>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="DoPaidTransfers">
        <xsl:param name="var:ClubId"/>
        <responseCode>
            <xsl:value-of select="CSharpCodeCall:DoPaidTransfers($var:ClubId)"/>
        </responseCode>
    </xsl:template>

    <msxsl:script language="C#" implements-prefix="CSharpCodeCall">
        <![CDATA[
        // I've stubbed this as a 10ms delay
        public System.String DoPaidTransfers(System.String clubId)
        {
            System.Threading.Thread.Sleep(10);
            return "Transferred";
        }
        ]]>
    </msxsl:script>

</xsl:stylesheet>
于 2012-11-15T16:15:26.247 回答