2016-02-15 2 views
1

Я пытаюсь очистить файл с произвольными именами элементов, который выглядит как:XSLT - Рекурсивный Пустой узел очистки

<root> 
    <nodeone> 
     <subnode blah="1" blah2="abc" /> 
    </nodeone> 
    <nodeone> 
     <subnode>with other stuff</subnode> 
    </nodeone> 
    <nodeone> 
     <subnode /> 
    </nodeone> 
</root> 

в файл, который выглядит как:

<root> 
    <nodeone> 
     <subnode blah="1" blah2="abc" /> 
    </nodeone> 
    <nodeone> 
     <subnode>with other stuff</subnode> 
    </nodeone> 
</root> 

Вы можете увидеть что все «nodeone», у которых были пустые дети, исчезли, но сохраняются любые <nodeone> с внутренним содержимым или непустыми атрибутами.

Моя текущая попытка решения является:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="*[not(normalize-space()) and not(@*)]"/> 

</xsl:stylesheet> 

Это удаляет любые узлы с пустым внутренним содержанием и сохраняет атрибуты, но и удаляет <nodeone /> текст из выходного сигнала, который не является желаемым результатом.

ответ

2

Если вы хотите, общее решение, то попробуйте этот шаблон

<xsl:template match="*[not(normalize-space()) and not(.//@*)]"/> 

Здесь .//@* проверит атрибутов текущего элемента (подкрепляются), и все элементы-потомки тоже.

0

Вы используете для элементов с любое имя, у которого нет ни текстового контента, ни атрибута. Таким образом, это соответствует вашим <nodeone> элементам. Попробуйте это:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="nodeone[*[not(normalize-space())][not(@*)]]"/> 
</xsl:stylesheet> 
+0

BTW, если вы хотите, чтобы также были удалены элементы без элементов «nodeone» (например, «»), используйте «' вместо этого. –

+0

Правильно, как я уже говорил, это документ с произвольными узлами в нем. Я не обязательно знаю, что они называются, но если они пустые и не имеют атрибутов содержания, я хочу, чтобы они не были удалены из вывода. Точка, я не могу создать структуру, подобную той, которую вы предоставили, которая выбирает определенные узлы. Имеет ли это смысл? – TRAL

+0

Итак, имя '' всегда nodeone, но '' может иметь другое имя? Я изменил свой ответ выше, чтобы отразить это. –

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