xslt使用输入过滤变量node-set

时间:2014-11-29 00:27:39

标签: xslt filter node-set

我遇到了麻烦,我认为,无法过滤变量节点集。

我有一个变量,其中填充了一组文档中的节点集,我想回显输入并添加变量节点,如果这些节点在输入中不存在。

<xsl:variable name="views" select="collection('file:/C:/temp/?select=*.xml;recurse=yes')"/>    

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
<!-- having trouble with the filter here never works -->
        <xsl:for-each select="$views/someElement[not(@name=(//someInputElement/@name))]">
<!-- copy stuff in -->
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

请注意,输入中会有许多带有名称属性的someInputElement实例。

当我针对目标运行xpath // someInputElement / @ name时,我按预期获得了一个列表。

任何最受赞赏的建议。

1 个答案:

答案 0 :(得分:0)

我相信我找到了答案......从我今天在其他地方找到的提示我已经添加了一个返回根目录并在过滤器中使用它。

<xsl:variable name="views" select="collection('file:/C:/temp/?select=*.xml;recurse=yes')"/>    
<xsl:variable name="root" select="/" />

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/">
    <xsl:copy>
        <xsl:apply-templates select="@* | *"/> 
        <!-- filter referring back to the root of the input -->
        <xsl:for-each select="$views/someElement[not(@name=($root//someInputElement/@name))]">
            <!-- copy stuff in -->
        </xsl:for-each>
    </xsl:copy>
</xsl:template>