2016-02-19 5 views
0

У меня есть следующий исходный 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>&#xa;</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.

ответ

1

Ваше текущее решение терпит неудачу, поскольку ось пространства имен всех элементов ниже корня содержит два узла (для пространства имен filter_this и filter_also). Таким образом, значение if всегда равно false.

Но вы можете проверить, если элемент не имеет URI пространства имен:

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

испытанный, это работает. Мое недоразумение заключалось в выборе xpath-ax вместо сравнения фактических префиксов. TY. – Helvdan

Смежные вопросы