2015-09-23 3 views
1

Я пытаюсь исключить узлы записи, если все, кроме одного элемента(), пустые. Для простоты, я уменьшил число элементов под записью элемента до четырех, но это возможно для меня, чтобы иметь до 50. (Так обратной логики проверки, если каждый field = '' был бы ужасно.)Исключить XML-узел, если все, кроме 1 (или 2) детей, пустые XSLT

Input

<root> 
<record> 
    <date>1/1/2015</date> 
    <text>not empty</text> 
    <text1/> 
    <text2>not empty</text2> 
</record> 
<record> 
    <date>1/3/2015</date> 
    <text/> 
    <text1/> 
    <text2/> 
</record> 
<record> 
    <date>1/5/2015</date> 
    <text/> 
    <text1/> 
    <text2>more not empty</text2> 
</record> 

ближайший я пришел следующая

<!--Identity template to copy all content by default--> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="record/*[not(node())]"/> 
<xsl:template match="date[not(following-sibling::* != '')]"/> 

Выход

<root> 
    <record> 
     <date>1/1/2015</date> 
     <text>not empty</text> 
     <text2>not empty</text2> 
    </record> 
    <record/> 
    <record> 
     <date>1/5/2015</date> 
     <text2>more not empty</text2> 
    </record> 
</root> 

Я хотел (а) исключить пустые <record/>. Это также не работает, если у меня есть второй «известный» элемент. Например, если на первой записи был элемент <date2>1/1/99</date2> ниже элемента даты. У кого-нибудь есть идеи?

ответ

1

Я пытаюсь исключить узлы записи, если все, кроме одного элемента(), пустые.

Как насчет подсчета количества не пустых?

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="record[count(*[node()]) &lt; 2]"/> 
<xsl:template match="record/*[not(node())]"/> 

</xsl:stylesheet> 

В качестве альтернативы, если вы хотите взглянуть на "неизвестных" узлов:

<xsl:template match="record[not(*[not(self::date or self::date1)][node()])]"/> 

Это подавляет любую запись, в которой все поля, которые не являются date или date1 не заполнены.

+0

Простой и элегантный! Спасибо! – hopkinch

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