我有以下源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
元素中可能存在具有随机命名空间的元素,而不仅仅是filter
或also_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>
</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解决方案还可以。
答案 0 :(得分:1)
您当前的解决方案失败,因为根目录下所有元素的命名空间轴包含两个节点(对于命名空间filter_this
和filter_also
)。所以if
总是评估为假。
但是你可以测试一个元素是否没有命名空间uri:
<xsl:if test="not(namespace-uri())">