给定调用datafile.xml的somefile.xslt,是否存在一个脚本,该脚本会输出datafile.xml中未被somefile.xslt调用的节点节的报告?
显然,每个文件的目视检查可以用作分析的基础,但我正在寻找一种自动化方法。
例如,我的xslt包含xpath,如:
<xsl:for-each select="//somenode/somesubnode/@attribute">
xml数据源应包含 somenode / somesubnode 数据结构。但是,如果它包含 someothernode 数据结构,该数据结构不是XSLT中调用的xpath的根元素或子元素,则它应该是“未使用的节点”报告的一部分。
答案 0 :(得分:1)
如果您使用推送方法(xsl:apply-templates
)而不是拉取方法(xsl:for-each
),您可以使用具有否定优先级的模板“捕获”任何不匹配的元素通过另一个模板。它更像是一种“无与伦比”的检查,而不是“未使用”的检查。
基本示例......
XML输入
<doc>
<foo>
<bar>bar text</bar>
</foo>
<foo2>
<bar>more bar text</bar>
</foo2>
</doc>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()" name="ident" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="doc|foo|bar">
<xsl:call-template name="ident"/>
</xsl:template>
<xsl:template match="*">
<xsl:processing-instruction name="unused-element">
<xsl:value-of select="name()"/>
</xsl:processing-instruction>
<xsl:call-template name="ident"/>
</xsl:template>
</xsl:stylesheet>
XML输出
<doc>
<foo>
<bar>bar text</bar>
</foo>
<?unused-element foo2?><foo2>
<bar>more bar text</bar>
</foo2>
</doc>