过滤具有已定义名称空间的所有元素

时间:2016-02-19 16:33:07

标签: xml xslt namespaces xslt-2.0 xml-namespaces

我有以下源xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:filter="filter_this" xmlns:also_filter="filter_also">
    <filter:error>This element should be filtred</filter:error>
    <ok>This is ok</ok>
    <filter:error>This element should be filtred also</filter:error>
    <ok>This is also ok</ok>
</root>

任务是过滤具有名称空间的元素,例如*:*root元素中可能存在具有随机命名空间的元素,而不仅仅是filteralso_filter,我仅将其作为示例。

所以期望的输出应该如下所示:

This is ok
This is also ok

我已经尝试过以下xslt-template:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes" method="text"/>

    <xsl:template match="/">
        <xsl:for-each select="/root/*">
            <xsl:if test="not(namespace::*)">
                <xsl:copy-of select="."/>
                <xsl:text>&#xa;</xsl:text>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

 </xsl:stylesheet>

给出空输出。我需要在<xsl:if...></xsl:if>语句中找出条件。请帮帮我:)

UPD: 由于Saxon-HE 9.5.1.7的使用,xslt 2.0解决方案还可以。

1 个答案:

答案 0 :(得分:1)

您当前的解决方案失败,因为根目录下所有元素的命名空间轴包含两个节点(对于命名空间filter_thisfilter_also)。所以if总是评估为假。

但是你可以测试一个元素是否没有命名空间uri:

<xsl:if test="not(namespace-uri())">