2014-12-08 7 views
0

У меня есть файл XML, как:XSLT-фильтр и выбрать первый элемент

<work> 
    <job name="dummy"> 
    <task>template</task> 
    <user>template</user> 
    </job> 
    <job name="unit1"> 
    <task>abc</task> 
    <user>def</user> 
    </job> 
    <job name="unit2"> 
    <task>abc1</task> 
    <user>xyz</user> 
    </job> 
</work> 

Я хочу, чтобы удалить все элементы, кроме первого задания, имя которого не «пустышка». Некоторые файлы могут содержать или не содержать задания с именем «фиктивный». Таким образом, в конечном итоге преобразованный файл должен выглядеть так:

<work> 
    <job name="unit1"> 
    <task>abc</task> 
    <user>def</user> 
    </job> 
</work> 

Как отфильтровать и выбрать в xslt?

ответ

2

Вы можете использовать

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

<xsl:template match="job[@name = 'dummy'] | job[not(@name = 'dummy')][position() > 1]"/> 
2

Самый простой подход был бы

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/*"> 
    <xsl:copy> 
     <!-- copy the first job-whose-name-is-not-dummy --> 
     <xsl:copy-of select="job[not(@name = 'dummy')][1]" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

Альтернативный способ думать об этом, если это является частью более крупной трансформации будет думать о том, что вы хотите игнорировать, а не то, что вы хотите сохранить:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

    <!-- copy everything as-is unless overridden --> 
    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <!-- ignore jobs named dummy --> 
    <xsl:template match="job[@name = 'dummy']" /> 

    <!-- ignore jobs *not* named dummy, apart from the first one --> 
    <xsl:template match="job[not(@name = 'dummy')][position() &gt; 1]" /> 

</xsl:stylesheet> 

Таким образом, вы можете определить дополнительные шаблоны, если вы хотите сделать что-то другое, чем прямое копирование с job элемента, который вы сделать хотите сохранить.

+0

Моя ситуация немного отличается, но, спасибо, я получил суть этого. Я копировал все узлы по умолчанию и удалял ненужные узлы за пределами шаблона копирования. Поэтому мне пришлось использовать две строки: и Rnet

+0

А, видел теперь ваше редактирование, спасибо :) – Rnet

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