2012-04-26 1 views
1

Я хочу выбрать все элементы, которые не существуют в другом узле.Выберите все элементы, которые не существуют в другом узле с XSLT

<root> 
    <users> 
    <array> 
     <name>John</name> 
     <age>30</age> 
    </array> 
    <array> 
     <name>Joe</name> 
     <age>30</age> 
    </array> 
    <array> 
     <name>Lou</name> 
     <age>30</age> 
    </array> 
    </users> 
    <selected_users> 
    <name>Joe</name> 
    <age>30</age> 
    </selected_users> 
</root> 

Так что я хочу из этого списка является Джон и Лу, так как их нет в списке выбранного узла пользователей ..

+0

Я изменил свой код, чтобы сделать это правильно сформированным. Пожалуйста, отредактируйте его, если он больше не точен. –

ответ

3

Вот короткий и простой способ сделать это:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes" method="text"/> 

    <xsl:template match="users/array/name[not(.=/*/selected_users/name)]"> 
     <xsl:value-of select="concat(., ' ')"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

Когда это преобразование применяются на предоставленном документе XML:

<root> 
    <users> 
     <array> 
      <name>John</name> 
      <age>30</age> 
     </array> 
     <array> 
      <name>Joe</name> 
      <age>30</age> 
     </array> 
     <array> 
      <name>Lou</name> 
      <age>30</age> 
     </array> 
    </users> 
    <selected_users> 
     <name>Joe</name> 
     <age>30</age> 
    </selected_users> 
</root> 

разыскиваемый, правильный результат :

John Lou 

Примечание:

Если вы хотите, чтобы получить нужный name элементы в переменной, используйте:

<xsl:variable name="vSomeName" select= 
"/*/users/array/name[not(.=/*/selected_users/name)]"/> 
2

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

/*/users/array/name[not(.=/*/selected_users/name)]

, чтобы получить «Джон» и «Лу». Я могу добавить пример XSLT, если вы укажете, какой тип вывода вы хотите получить.

+0

Хмм .. Я просто хочу имя .. Так что я думаю, что-то вроде этого: ffffff01

+0

@DevNull: 'xsl: value-of' выводит строковое значение только первого узла в наборе узлов, указанного в атрибуте' select'. И ваш код на самом деле (из-за этого) производит только «Джон» –

+0

@DimitreNovatchev - Вы абсолютно правы. Я поклялся, что проверял это до того, как я опубликовал. Я полностью удалю пример. –

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