用于确定XSLT和XML数据源之间未使用的元素的脚本

时间:2014-02-07 20:36:35

标签: xml xslt

给定调用datafile.xml的somefile.xslt,是否存在一个脚本,该脚本会输出datafile.xml中未被somefile.xslt调用的节点节的报告?

显然,每个文件的目视检查可以用作分析的基础,但我正在寻找一种自动化方法。

例如,我的xslt包含xpath,如:

<xsl:for-each select="//somenode/somesubnode/@attribute">

xml数据源应包含 somenode / somesubnode 数据结构。但是,如果它包含 someothernode 数据结构,该数据结构不是XSLT中调用的xpath的根元素或子元素,则它应该是“未使用的节点”报告的一部分。

1 个答案:

答案 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>