У меня есть следующий исходный 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-шаблона:
<?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: xslt 2.0 решения в порядке из-за использования Saxon-HE 9.5.1.7.
испытанный, это работает. Мое недоразумение заключалось в выборе xpath-ax вместо сравнения фактических префиксов. TY. – Helvdan