代码需要清理。第一步是找到未使用的代码
(模板、变量等)。
我的问题是关于寻找不再使用的匹配模板:
好消息是,事情并不像我在另一个答案中看到的那么理论化(而且几乎没有希望)。仅通过静态分析就可以获得很多有用的信息。
最近我做了类似的事情。这个简单的转换发现在 530 个 .xsl 或 .xslt 文件中,有 180 个是“主要”文件(未导入或包含在任何其他样式表中)。
然后逐一查看“主要”样式表并确定它是否曾经用作主要(独立)转换,从而可以排除大量此类 XSLT 文件。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vBaseFileUrl" select="'file:///C:/TheDirectoryPathToTheXSLTCode'"/>
<xsl:variable name="vStyleSheets" select=
"collection(concat($vBaseFileUrl, '?select=*.xsl;recurse=yes'))
|
collection(concat($vBaseFileUrl, '?select=*.xslt;recurse=yes'))"/>
<xsl:template match="/">
Number of *.xsl | *.xslt stylesheets: <xsl:value-of select="count($vStyleSheets)"/>
Document URIs:
<xsl:variable name="vdocURIs" select="$vStyleSheets/document-uri(.)"/>
<xsl:value-of select="$vdocURIs" separator="
"/>
<xsl:variable name="vDistinctFilenames" select=
"distinct-values($vStyleSheets/tokenize(document-uri(.), '/')[last()])"/>
<xsl:value-of select="'
','
',
'Distinctly named stylesheets: ', count($vDistinctFilenames)"/>
<xsl:variable name="vMainFilenames" select=
"$vDistinctFilenames
[not(. = $vStyleSheets/*/(xsl:import | xsl:include)/tokenize(@href, '/')[last()])]"/>
<xsl:value-of select="'
','
','Main filenames: ', count($vMainFilenames)"/>
<xsl:variable name="vMainStylesheets" select=
"$vStyleSheets[tokenize(document-uri(.), '/')[last()] = $vMainFilenames]
"/>
<xsl:value-of select="'
','
','Main stylesheets: ', count($vMainStylesheets)"/>
==========================================
Document URIs grouped by name: <xsl:text/>
<xsl:for-each-group select="$vdocURIs" group-by="tokenize(., '/')[last()]">
<xsl:sort select="current-grouping-key()"/>
<xsl:variable name="vStylesheetFilename" select="current-grouping-key()"/>
<xsl:variable name="vImportedOrIncluded" select=
"$vStyleSheets[/*/(xsl:import | xsl:include)[tokenize(@href, '/')[last()]
eq $vStylesheetFilename]][1]"/>
<xsl:value-of select="'
', '
',
$vStylesheetFilename,
if(empty($vImportedOrIncluded)) then ' Main ' else (), ':'"/>
==========================================
<xsl:text/>
<xsl:variable name="vUrisInGroup" as="xs:string*">
<xsl:perform-sort select="current-group()">
<xsl:sort select="."/>
</xsl:perform-sort>
</xsl:variable>
<xsl:for-each select="$vUrisInGroup">
<xsl:value-of select=
"substring-after(., substring-before(., 'nameOfRootDir')), '
'"/>
</xsl:for-each>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
在匹配模板的层面上:
让我们来:
<xsl:template match="possiblySomepath/someName[PossiblySomePredicate]/possibleTailPath">
我们分析了一组可能的源 XML 文档,并确定它们从不包含名为“someName”的元素——或者在更好的情况下,我们有一个可用的源 XML Schema,从中我们可以看到没有名为“ someName”包含在文档中。然后我们可以安全地删除该模板。
至于“主”样式表,在我们排除了明显的这些之后,我们可以通过类似的方式调查并找到没有匹配<xsl:call-template> 指令的命名模板——和摆脱所有这些。
代码将是这样的:
==========================================
<xsl:variable name="vTemplateNamesDistinct"
select="distinct-values($vStyleSheets/*/xsl:template/@name)"/>
<xsl:value-of select=
"'
','
','Distinct template names: ', count($vTemplateNamesDistinct)"/>
<xsl:variable name="vnamedTemplatesNeverCalled" select=
"distinct-values($vStyleSheets/*/xsl:template/@name
[not(. = $vStyleSheets//xsl:call-template/@name)])"/>
<xsl:value-of select=
"'
','
','Template names never called: ', count($vnamedTemplatesNeverCalled)"/>
<xsl:value-of select="$vnamedTemplatesNeverCalled" separator="
"/>
==========================================
在我的例子中,大约有 400 个命名模板。其中 40 多个命名模板未被调用。